diff --git a/.github/workflows/arduino_cron.yml b/.github/workflows/arduino_cron.yml index d8b0cbcb0..88e5502fe 100644 --- a/.github/workflows/arduino_cron.yml +++ b/.github/workflows/arduino_cron.yml @@ -39,7 +39,8 @@ jobs: [[ $changedfile == *.cpp ]] || [[ $changedfile == *.h ]] || [[ $changedfile == *.hpp ]] || - [[ $changedfile == *.ino ]]; then + [[ $changedfile == *.ino ]] || + [[ $changedfile == *.yml ]]; then ischanged=true break fi @@ -60,7 +61,7 @@ jobs: strategy: fail-fast: false matrix: - arduino-platform: ["cpb", "cpc", "cpx_ada", "esp32", "esp8266", "feather32u4", "feather_m0_express", "feather_m4_express", "feather_rp2040", "flora", "funhouse", "gemma", "gemma_m0", "hallowing_m0", "hallowing_m4_tinyusb", "magtag", "metro_m0", "metro_m0_tinyusb", "metro_m4", "metro_m4_tinyusb", "monster_m4sk", "monster_m4sk_tinyusb", "neokeytrinkey_m0", "neotrellis_m4", "nrf52832", "nrf52840", "pycamera_s3", "protrinket_5v", "proxlighttrinkey_m0", "pybadge", "pygamer", "pyportal", "qualia_s3_rgb666", "qt2040_trinkey", "qtpy_m0", "qtpy_esp32s2", "rotarytrinkey_m0", "slidetrinkey_m0", "trinket_m0", "uno", "trinket_5v", "ledglasses_nrf52840" ] + arduino-platform: ["cpb", "cpc", "cpx_ada", "esp32", "esp8266", "feather32u4", "feather_esp32c6", "feather_m0_express", "feather_m4_express", "feather_rp2040", "feather_rp2040_adalogger", "flora", "funhouse", "gemma", "gemma_m0", "hallowing_m0", "hallowing_m4_tinyusb", "ledglasses_nrf52840", "magtag", "metro_m0", "metro_m0_tinyusb", "metro_m4", "metro_m4_tinyusb", "monster_m4sk", "monster_m4sk_tinyusb", "neokeytrinkey_m0", "neotrellis_m4", "nrf52832", "nrf52840", "pixeltrinkey_m0", "protrinket_5v", "proxlighttrinkey_m0", "pybadge", "pycamera_s3", "pygamer", "pyportal", "qualia_s3_rgb666", "qt2040_trinkey", "qtpy_m0", "qtpy_esp32s2", "rotarytrinkey_m0", "sht4xtrinkey_m0", "slidetrinkey_m0", "trinket_5v", "trinket_m0", "uno"] runs-on: ubuntu-latest if: needs.check-if-needed.outputs.answer == 'true' needs: check-if-needed @@ -68,6 +69,11 @@ jobs: - uses: actions/setup-python@v5 with: python-version: "3.x" + + # Checkout the learn repo itself + - uses: actions/checkout@v4 + + # Checkout the CI scripts - uses: actions/checkout@v4 with: repository: adafruit/ci-arduino diff --git a/A4988_Examples/Arduino_A4988/Arduino_A4988.ino b/A4988_Examples/Arduino_A4988/Arduino_A4988.ino new file mode 100644 index 000000000..a92da1212 --- /dev/null +++ b/A4988_Examples/Arduino_A4988/Arduino_A4988.ino @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +const int DIR = 5; +const int STEP = 6; +const int microMode = 16; // microstep mode, default is 1/16 so 16; ex: 1/4 would be 4 +// full rotation * microstep divider +const int steps = 200 * microMode; + +void setup() +{ + // setup step and dir pins as outputs + pinMode(STEP, OUTPUT); + pinMode(DIR, OUTPUT); +} + +void loop() +{ + // change direction every loop + digitalWrite(DIR, !digitalRead(DIR)); + // toggle STEP to move + for(int x = 0; x < steps; x++) + { + digitalWrite(STEP, HIGH); + delay(2); + digitalWrite(STEP, LOW); + delay(2); + } + delay(1000); // 1 second delay +} diff --git a/A4988_Examples/CircuitPython_A4988/code.py b/A4988_Examples/CircuitPython_A4988/code.py new file mode 100644 index 000000000..b328ca8a9 --- /dev/null +++ b/A4988_Examples/CircuitPython_A4988/code.py @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +from digitalio import DigitalInOut, Direction + +# direction and step pins as outputs +DIR = DigitalInOut(board.D5) +DIR.direction = Direction.OUTPUT +STEP = DigitalInOut(board.D6) +STEP.direction = Direction.OUTPUT + +# microstep mode, default is 1/16 so 16 +# another ex: 1/4 microstep would be 4 +microMode = 16 +# full rotation multiplied by the microstep divider +steps = 200 * microMode + +while True: + # change direction every loop + DIR.value = not DIR.value + # toggle STEP pin to move the motor + for i in range(steps): + STEP.value = True + time.sleep(0.001) + STEP.value = False + time.sleep(0.001) + print("rotated! now reverse") + # 1 second delay before starting again + time.sleep(1) diff --git a/adalogger/.uno.test.only b/ADG72x_Examples/Arduino_ADG728_Plotter/.uno.test.only similarity index 100% rename from adalogger/.uno.test.only rename to ADG72x_Examples/Arduino_ADG728_Plotter/.uno.test.only diff --git a/ADG72x_Examples/Arduino_ADG728_Plotter/Arduino_ADG728_Plotter.ino b/ADG72x_Examples/Arduino_ADG728_Plotter/Arduino_ADG728_Plotter.ino new file mode 100644 index 000000000..fcf6b8345 --- /dev/null +++ b/ADG72x_Examples/Arduino_ADG728_Plotter/Arduino_ADG728_Plotter.ino @@ -0,0 +1,65 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +Adafruit_ADG72x adg72x; + +bool isADG728 = false; // which chip are we connected to? + +int analogIn = A0; +int analogValue = 0; +unsigned long switchTimer = 1000; // 1000 ms = 1 second for channel switch +unsigned long readTimer = 10; // 10 ms for analog read +unsigned long lastSwitchTime = 0; // Last time the channels were switched +unsigned long lastReadTime = 0; // Last time the analog was read +uint8_t currentChannel = 0; // Current channel being selected + +void setup() { + Serial.begin(115200); + + // Wait for serial port to open + while (!Serial) { + delay(1); + } + + // Try with the ADG728 default address first... + if (adg72x.begin(ADG728_DEFAULT_ADDR, &Wire)) { + Serial.println("ADG728 found!"); + isADG728 = true; + } + // Maybe they have an ADG729? + else if (adg72x.begin(ADG729_DEFAULT_ADDR, &Wire)) { + Serial.println("ADG729 found!"); + isADG728 = false; + } + else { + Serial.println("No ADG device found? Check wiring!"); + while (1); // Stop here if no device was found + } +} + +void loop() { + unsigned long currentTime = millis(); + + // read and print analog value every 10ms + if ((currentTime - lastReadTime) >= readTimer) { + analogValue = analogRead(analogIn); + Serial.println(analogValue); + lastReadTime = currentTime; + } + + // switch channels every 1 second + if ((currentTime - lastSwitchTime) >= switchTimer) { + uint8_t bits = 1 << currentChannel; // Shift a '1' from LSB to MSB + if (!adg72x.selectChannels(bits)) { + Serial.println("Failed to set channels..."); + } + /*Serial.print((currentChannel % 4) + 1); + if (currentChannel < 4) Serial.println("A"); + else Serial.println("B");*/ + currentChannel = (currentChannel + 1) % 8; // Move to the next channel, wrap around at 8 + lastSwitchTime = currentTime; + } +} diff --git a/AtariFruit_Joystick/.nrf52832.test.only b/ADG72x_Examples/Arduino_ADG729_Plotter/.uno.test.only similarity index 100% rename from AtariFruit_Joystick/.nrf52832.test.only rename to ADG72x_Examples/Arduino_ADG729_Plotter/.uno.test.only diff --git a/ADG72x_Examples/Arduino_ADG729_Plotter/Arduino_ADG729_Plotter.ino b/ADG72x_Examples/Arduino_ADG729_Plotter/Arduino_ADG729_Plotter.ino new file mode 100644 index 000000000..c704b578b --- /dev/null +++ b/ADG72x_Examples/Arduino_ADG729_Plotter/Arduino_ADG729_Plotter.ino @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +Adafruit_ADG72x adg72x; + +int analogInA0 = A0; +int analogInA1 = A1; +int analogValueDA = 0; +int analogValueDB = 0; +unsigned long switchTimer = 1000; // 1000 ms = 1 second for channel switch +unsigned long readTimer = 10; // 10 ms for analog read +unsigned long lastSwitchTime = 0; // Last time the channels were switched +unsigned long lastReadTime = 0; // Last time the analog was read +uint8_t currentChannel = 0; // Current channel being selected + +void setup() { + Serial.begin(115200); + + // Wait for serial port to open + while (!Serial) { + delay(1); + } + + // Try with the ADG728 default address first... + if (adg72x.begin(ADG728_DEFAULT_ADDR, &Wire)) { + //Serial.println("ADG728 found!"); + } + // Maybe they have an ADG729? + else if (adg72x.begin(ADG729_DEFAULT_ADDR, &Wire)) { + //Serial.println("ADG729 found!"); + } + else { + Serial.println("No ADG72x device found? Check wiring!"); + while (1); // Stop here if no device was found + } +} + +void loop() { + unsigned long currentTime = millis(); + + // read and print analog value every 10ms + if ((currentTime - lastReadTime) >= readTimer) { + analogValueDA = analogRead(analogInA0); + analogValueDB = analogRead(analogInA1); + Serial.print(analogValueDA); + Serial.print(","); + Serial.println(analogValueDB); + lastReadTime = currentTime; + } + + // switch channels every 1 second + if ((currentTime - lastSwitchTime) >= switchTimer) { + uint8_t bits = 1 << currentChannel; // Shift a '1' from LSB to MSB + if (!adg72x.selectChannels(bits)) { + Serial.println("Failed to set channels..."); + } + /*Serial.print((currentChannel % 4) + 1); + if (currentChannel < 4) Serial.println("A"); + else Serial.println("B");*/ + currentChannel = (currentChannel + 1) % 8; // Move to the next channel, wrap around at 8 + lastSwitchTime = currentTime; + } +} diff --git a/ADG72x_Examples/CircuitPython_ADG728/code.py b/ADG72x_Examples/CircuitPython_ADG728/code.py new file mode 100644 index 000000000..65ca8b071 --- /dev/null +++ b/ADG72x_Examples/CircuitPython_ADG728/code.py @@ -0,0 +1,26 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +import adafruit_adg72x +from analogio import AnalogIn + +analog_in = AnalogIn(board.A0) + +i2c = board.I2C() +switch = adafruit_adg72x.ADG72x(i2c) + +c = 0 +switch_time = 2 +channels = [0, 4] +clock = time.monotonic() +while True: + if (time.monotonic() - clock) > switch_time: + print(f"Selecting channel {channels[c] + 1}") + switch.channel = channels[c] + c = (c + 1) % 2 + clock = time.monotonic() + print((analog_in.value,)) + time.sleep(0.1) diff --git a/ADG72x_Examples/CircuitPython_ADG729/code.py b/ADG72x_Examples/CircuitPython_ADG729/code.py new file mode 100644 index 000000000..6b0dad45c --- /dev/null +++ b/ADG72x_Examples/CircuitPython_ADG729/code.py @@ -0,0 +1,31 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +import adafruit_adg72x +from analogio import AnalogIn + +analog_in_DA = AnalogIn(board.A0) +analog_in_DB = AnalogIn(board.A1) + +i2c = board.I2C() +switch = adafruit_adg72x.ADG72x(i2c, 0x44) + +c = 0 +switch_time = 3 +clock = time.monotonic() + +while True: + if (time.monotonic() - clock) > switch_time: + if c < 4: + channels = "A" + else: + channels = "B" + print(f"Selecting channel {(c % 4) + 1}{channels}") + switch.channel = c + c = (c + 1) % 8 + clock = time.monotonic() + print((analog_in_DA.value, analog_in_DB.value,)) + time.sleep(0.1) diff --git a/Adafruit_ESP32_Arduino_Demos/ESP32_sleeptest/ESP32_sleeptest.ino b/Adafruit_ESP32_Arduino_Demos/ESP32_sleeptest/ESP32_sleeptest.ino index 69e6f9c09..8938c74f7 100644 --- a/Adafruit_ESP32_Arduino_Demos/ESP32_sleeptest/ESP32_sleeptest.ino +++ b/Adafruit_ESP32_Arduino_Demos/ESP32_sleeptest/ESP32_sleeptest.ino @@ -93,7 +93,7 @@ void disableInternalPower() { #endif #if defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2) - // turn on the I2C power by setting pin to rest state (off) + // turn off the I2C power by setting pin to rest state (off) pinMode(PIN_I2C_POWER, INPUT); pinMode(NEOPIXEL_POWER, OUTPUT); digitalWrite(NEOPIXEL_POWER, LOW); diff --git a/Adafruit_IO_Power_Relay/code.py b/Adafruit_IO_Power_Relay/code.py index ac981b25e..2361eb69f 100755 --- a/Adafruit_IO_Power_Relay/code.py +++ b/Adafruit_IO_Power_Relay/code.py @@ -2,6 +2,7 @@ # # SPDX-License-Identifier: MIT +import os import time import board import busio @@ -15,12 +16,10 @@ import adafruit_minimqtt.adafruit_minimqtt as MQTT ### WiFi ### -# Get wifi details and more from a secrets.py file -try: - from secrets import secrets -except ImportError: - print("WiFi secrets are kept in secrets.py, please add them there!") - raise +secrets = { + "ssid" : os.getenv("CIRCUITPY_WIFI_SSID"), + "password" : os.getenv("CIRCUITPY_WIFI_PASSWORD"), +} # If you are using a board with pre-defined ESP32 Pins: esp32_cs = DigitalInOut(board.ESP_CS) @@ -55,7 +54,7 @@ power_pin.switch_to_output() ### Feeds ### # Set up a feed named Relay for subscribing to the relay feed on Adafruit IO -feed_relay = secrets["aio_username"] + "/feeds/relay" +feed_relay = os.getenv("AIO_USERNAME") + "/feeds/relay" ### Code ### @@ -107,8 +106,8 @@ ssl_context = adafruit_connection_manager.get_radio_ssl_context(esp) # Set up a MiniMQTT Client client = MQTT.MQTT( broker="io.adafruit.com", - username=secrets["aio_username"], - password=secrets["aio_key"], + username=os.getenv("AIO_USERNAME"), + password=os.getenv("AIO_KEY"), socket_pool=pool, ssl_context=ssl_context, ) diff --git a/Arduino_Nano_RP2040_Connect/arduino_nano_rp2040_connect_wifi/code.py b/Arduino_Nano_RP2040_Connect/arduino_nano_rp2040_connect_wifi/code.py index 63147991d..06d799abb 100644 --- a/Arduino_Nano_RP2040_Connect/arduino_nano_rp2040_connect_wifi/code.py +++ b/Arduino_Nano_RP2040_Connect/arduino_nano_rp2040_connect_wifi/code.py @@ -46,7 +46,7 @@ print("Firmware vers.", esp.firmware_version) print("MAC addr:", [hex(i) for i in esp.MAC_address]) for ap in esp.scan_networks(): - print("\t%s\t\tRSSI: %d" % (str(ap['ssid'], 'utf-8'), ap['rssi'])) + print("\t%s\t\tRSSI: %d" % (str(ap.ssid, 'utf-8'), ap.rssi)) print("Connecting to AP...") while not esp.is_connected: @@ -55,7 +55,7 @@ while not esp.is_connected: except RuntimeError as e: print("could not connect to AP, retrying: ", e) continue -print("Connected to", str(esp.ssid, "utf-8"), "\tRSSI:", esp.rssi) +print("Connected to", str(esp.ap_info.ssid, "utf-8"), "\tRSSI:", esp.ap_info.rssi) print("My IP address is", esp.pretty_ip(esp.ip_address)) print( diff --git a/Cheekmate/Arduino/Cheekmate/.qtpy_esp32s2.test.only b/Arduino_VCNL4200_simpletest/.uno.test.only similarity index 100% rename from Cheekmate/Arduino/Cheekmate/.qtpy_esp32s2.test.only rename to Arduino_VCNL4200_simpletest/.uno.test.only diff --git a/Arduino_VCNL4200_simpletest/Arduino_VCNL4200_simpletest.ino b/Arduino_VCNL4200_simpletest/Arduino_VCNL4200_simpletest.ino new file mode 100644 index 000000000..2579fdd45 --- /dev/null +++ b/Arduino_VCNL4200_simpletest/Arduino_VCNL4200_simpletest.ino @@ -0,0 +1,50 @@ +// SPDX-FileCopyrightText: 2024 ladyada for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "Adafruit_VCNL4200.h" + +Adafruit_VCNL4200 vcnl4200; + +void setup() { + Serial.begin(115200); + while (!Serial) { + delay(10); // wait for native USB + } + + Serial.println("Adafruit VCNL4200 ALS simple test"); + + if (!vcnl4200.begin()) { + Serial.println("Could not find a valid VCNL4200 sensor, check wiring!"); + while (1) { + delay(10); + } + } + Serial.println("VCNL4200 found!"); + + vcnl4200.setALSshutdown(false); + vcnl4200.setALSIntegrationTime(VCNL4200_ALS_IT_100MS); + vcnl4200.setALSPersistence(VCNL4200_ALS_PERS_2); + + vcnl4200.setProxShutdown(false); + vcnl4200.setProxHD(false); + vcnl4200.setProxLEDCurrent(VCNL4200_LED_I_200MA); + vcnl4200.setProxIntegrationTime(VCNL4200_PS_IT_8T); +} + +void loop() { + // Read the proximity sensor data + uint16_t proxData = vcnl4200.readProxData(); + Serial.print("Prox Data: "); + Serial.println(proxData); + // Read the ambient light sensor (ALS) data + uint16_t alsData = vcnl4200.readALSdata(); + Serial.print("ALS Data: "); + Serial.print(alsData); + // Read the raw white sensor data + uint16_t whiteData = vcnl4200.readWhiteData(); + Serial.print(", White Data: "); + Serial.println(whiteData); + + delay(100); +} diff --git a/ESP32_S2_WiFi_Tests/JSONdemo/.esp32.test.only b/AtariFruit_Joystick/.none.test.only similarity index 100% rename from ESP32_S2_WiFi_Tests/JSONdemo/.esp32.test.only rename to AtariFruit_Joystick/.none.test.only diff --git a/BLE_Apple_Watch_Controller/code.py b/BLE_Apple_Watch_Controller/code.py new file mode 100644 index 000000000..9b57bc199 --- /dev/null +++ b/BLE_Apple_Watch_Controller/code.py @@ -0,0 +1,113 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import microcontroller +import board +from adafruit_hid.keyboard import Keyboard +from adafruit_hid.keycode import Keycode +import adafruit_ble +from adafruit_ble.advertising import Advertisement +from adafruit_ble.advertising.standard import ProvideServicesAdvertisement +from adafruit_ble.services.standard.hid import HIDService +from adafruit_seesaw import seesaw, rotaryio, digitalio + +# ios modifier +mod = Keycode.CAPS_LOCK +# keycodes +KBD_CODES = [ + [Keycode.SPACE], # center + [mod], # up + [Keycode.LEFT_ARROW], # left + [Keycode.DOWN_ARROW], # down + [Keycode.RIGHT_ARROW], # right +] + +i2c = board.STEMMA_I2C() +seesaw = seesaw.Seesaw(i2c, addr=0x49) + +seesaw_product = (seesaw.get_version() >> 16) & 0xFFFF +print(f"Found product {seesaw_product}") +if seesaw_product != 5740: + print("Wrong firmware loaded? Expected 5740") + +buttons = [] +button_names = ["Select", "Up", "Left", "Down", "Right"] +button_states = [] + +for s in range(1, 6): + seesaw.pin_mode(s, seesaw.INPUT_PULLUP) + pin = digitalio.DigitalIO(seesaw, s) + pin_state = False + buttons.append(pin) + button_states.append(pin_state) + +encoder = rotaryio.IncrementalEncoder(seesaw) +last_position = 0 + +if not buttons[0].value and button_states[0] is False: + button_states[0] = True + try: + import _bleio + time.sleep(2) + _bleio.adapter.erase_bonding() + time.sleep(2) + print("Last BLE bonding deleted, restarting..") + time.sleep(2) + microcontroller.reset() + except Exception: # pylint: disable=broad-except + pass + +# BLE HID setup +hid = HIDService() +# keyboard & mouse HID setup +kbd = Keyboard(hid.devices) + +advertisement = ProvideServicesAdvertisement(hid) +advertisement.appearance = 961 +scan_response = Advertisement() +scan_response.complete_name = "CircuitPython HID" +ble = adafruit_ble.BLERadio() + +if not ble.connected: + print("advertising") + ble.start_advertising(advertisement, scan_response) +else: + print("already connected") + print(ble.connections) +time.sleep(2) + +while True: + # check for BLE connection + while not ble.connected: + pass + # while BLE connected + while ble.connected: + position = encoder.position + if position != last_position: + # if the encoder is turned to the right + if position > last_position: + kbd.send(Keycode.RIGHT_ARROW) + # if the encoder is turned to the left + if position < last_position: + kbd.send(Keycode.LEFT_ARROW) + # reset encoder position + last_position = position + print(f"Position: {position}") + for b in range(5): + if not buttons[b].value and button_states[b] is False: + button_states[b] = True + if b != 0: + kbd.press(*KBD_CODES[b]) + print(*KBD_CODES[b]) + else: + kbd.press(mod) + kbd.press(*KBD_CODES[b]) + print(f"{button_names[b]} button pressed") + if buttons[b].value and button_states[b] is True: + button_states[b] = False + kbd.release_all() + print(f"{button_names[b]} button released") + # if BLE disconnects, begin advertising again + ble.start_advertising(advertisement) diff --git a/BLE_Client_Server/client/code.py b/BLE_Client_Server/client/code.py index fe570463d..59da1ece7 100644 --- a/BLE_Client_Server/client/code.py +++ b/BLE_Client_Server/client/code.py @@ -2,9 +2,13 @@ # # SPDX-License-Identifier: MIT +from binascii import unhexlify from time import sleep -from adafruit_ble.uart_client import UARTClient -from adafruit_ble.scanner import Scanner + +from micropython import const +from adafruit_ble import BLERadio +from adafruit_ble.advertising.standard import ProvideServicesAdvertisement +from adafruit_ble.services.nordic import UARTService from adafruit_bluefruit_connect.packet import Packet from adafruit_bluefruit_connect.button_packet import ButtonPacket from adafruit_bluefruit_connect.color_packet import ColorPacket @@ -21,65 +25,75 @@ switch = Debouncer(pin) pixels = NeoPixel(NEOPIXEL, 1) # Set up built-in NeoPixel -AQUA = 0x00FFFF # (0, 255, 255) -GREEN = 0x00FF00 # (0, 255, 0) -ORANGE = 0xFF8000 # (255, 128, 0) -RED = 0xFF0000 # (255, 0, 0) -BLUE = 0x0000FF # (0, 0, 255) +AQUA = const(0x00FFFF) # (0, 255, 255) +GREEN = const(0x00FF00) # (0, 255, 0) +ORANGE = const(0xFF8000) # (255, 128, 0) +RED = const(0xFF0000) # (255, 0, 0) +BLUE = const(0x0000FF) # (0, 0, 255) -gradients = {'Off': [(0.0, RED), (0.75, ORANGE)], - 'On': [(0.0, GREEN), (1.0, AQUA)]} -palette = fancy.expand_gradient(gradients['Off'], 30) +gradients = {"Off": [(0.0, RED), (0.75, ORANGE)], "On": [(0.0, GREEN), (1.0, AQUA)]} +palette = fancy.expand_gradient(gradients["Off"], 30) gamma_levels = (0.25, 0.3, 0.15) color_index = 1 fade_direction = 1 -TARGET = 'a0:b4:c2:d0:e7:f2' # CHANGE TO YOUR BLE ADDRESS +TARGET = "f0:74:72:60:87:d2" # CHANGE TO YOUR BLE ADDRESS +target_address = TARGET.split(":") # Convert address string to list of bytes +target_address.reverse() # Reverse bytes to match Address class little-endian +target_address = unhexlify("".join(target_address)) # Convert list to bytes button_packet = ButtonPacket("1", True) # Transmits pressed button 1 -scanner = Scanner() # BLE Scanner -uart_client = UARTClient() # BLE Client +ble = BLERadio() +uart_client = None while True: uart_addresses = [] pixels[0] = BLUE # Blue LED indicates disconnected status pixels.show() - # Keep trying to find target UART peripheral - while not uart_addresses: - uart_addresses = uart_client.scan(scanner) - for address in uart_addresses: - if TARGET in str(address): - uart_client.connect(address, 5) # Connect to target + if not uart_client: + print("Trying to connect to BLE server...") + # Keep trying to find target UART peripheral + for adv in ble.start_scan(ProvideServicesAdvertisement): + print(adv.address.address_bytes) # Print detected addresses + if adv.address.address_bytes == target_address: + uart_client = ble.connect(adv) + print("Connected") + break + ble.stop_scan() - while uart_client.connected: # Connected - switch.update() - if switch.fell: # Check for button press - try: - uart_client.write(button_packet.to_bytes()) # Transmit press - except OSError: - pass - # Check for LED status receipt - if uart_client.in_waiting: - packet = Packet.from_stream(uart_client) - if isinstance(packet, ColorPacket): - if fancy.CRGB(*packet.color).pack() == GREEN: # Color match - # Green indicates on state - palette = fancy.expand_gradient(gradients['On'], 30) - else: - # Otherwise red indicates off - palette = fancy.expand_gradient(gradients['Off'], 30) + if uart_client and uart_client.connected: + uart_service = uart_client[UARTService] + while uart_client and uart_client.connected: # Connected + switch.update() + if switch.fell: # Check for button press + try: + # Transmit press + uart_service.write(button_packet.to_bytes()) + except OSError: + pass + # Check for LED status receipt + if uart_service.in_waiting: + packet = Packet.from_stream(uart_service) + if isinstance(packet, ColorPacket): + # Color match + if fancy.CRGB(*packet.color).pack() == GREEN: + # Green indicates on state + palette = fancy.expand_gradient(gradients["On"], 30) + else: + # Otherwise red indicates off + palette = fancy.expand_gradient(gradients["Off"], 30) - # NeoPixel color fading routing - color = fancy.palette_lookup(palette, color_index / 29) - color = fancy.gamma_adjust(color, brightness=gamma_levels) - c = color.pack() - pixels[0] = c - pixels.show() - if color_index in (0, 28): - fade_direction *= -1 # Change direction - color_index += fade_direction + # NeoPixel color fading routing + color = fancy.palette_lookup(palette, color_index / 29) + color = fancy.gamma_adjust(color, brightness=gamma_levels) + c = color.pack() + pixels[0] = c + pixels.show() + if color_index in (0, 28): + fade_direction *= -1 # Change direction + color_index += fade_direction - sleep(0.02) + sleep(0.02) diff --git a/BLE_RS232_Controller/code.py b/BLE_RS232_Controller/code.py new file mode 100644 index 000000000..3251d31b6 --- /dev/null +++ b/BLE_RS232_Controller/code.py @@ -0,0 +1,66 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# SPDX-License-Identifier: MIT + +import time +import board +import busio +from adafruit_bluefruit_connect.packet import Packet +from adafruit_bluefruit_connect.button_packet import ButtonPacket +from adafruit_ble import BLERadio +from adafruit_ble.advertising.standard import ProvideServicesAdvertisement +from adafruit_ble.services.nordic import UARTService +import neopixel + +# baud rate for your device +baud = 38400 +# commands for your device +commands = ["AVI=1", "AVI=2", "AVI=3", "AVI=4"] +# Initialize UART for the RS232 +uart = busio.UART(board.TX, board.RX, baudrate=baud) +# onboard neopixel +pixels = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.5, auto_write=True) +RED = (255, 0, 0) +BLUE = (0, 0, 255) +# BLE setup +ble = BLERadio() +ble_uart = UARTService() +advertisement = ProvideServicesAdvertisement(ble_uart) +advertising = False +print("advertising..") +while True: + if not ble.connected and not advertising: + # not connected in the app yet + pixels.fill(RED) + ble.start_advertising(advertisement) + advertising = True + + while ble.connected: + pixels.fill(BLUE) + # after connected via app + advertising = False + if ble_uart.in_waiting: + # waiting for input from app + packet = Packet.from_stream(ble_uart) + if isinstance(packet, ButtonPacket): + # if buttons in the app are pressed + if packet.pressed: + if packet.button == ButtonPacket.BUTTON_1: + uart.write((commands[0] + "\r\n").encode('ascii')) + if packet.button == ButtonPacket.BUTTON_2: + uart.write((commands[1] + "\r\n").encode('ascii')) + if packet.button == ButtonPacket.BUTTON_3: + uart.write((commands[2] + "\r\n").encode('ascii')) + if packet.button == ButtonPacket.BUTTON_4: + uart.write((commands[3] + "\r\n").encode('ascii')) + # empty buffer to collect the incoming data + response_buffer = bytearray() + # check for data + time.sleep(1) + while uart.in_waiting: + data = uart.read(uart.in_waiting) + if data: + response_buffer.extend(data) + # decode and print + if response_buffer: + print(response_buffer.decode('ascii'), end='') + print() diff --git a/EyeLights_Accelerometer_Tap/EyeLights_Accelerometer_Tap/.ledglasses_nrf52840.generate b/BNO055_BMP280_BFF_Examples/BNO055_BMP280_BFF_Arduino_Demo/.qtpy_m0.test.only similarity index 100% rename from EyeLights_Accelerometer_Tap/EyeLights_Accelerometer_Tap/.ledglasses_nrf52840.generate rename to BNO055_BMP280_BFF_Examples/BNO055_BMP280_BFF_Arduino_Demo/.qtpy_m0.test.only diff --git a/BNO055_BMP280_BFF_Examples/BNO055_BMP280_BFF_Arduino_Demo/BNO055_BMP280_BFF_Arduino_Demo.ino b/BNO055_BMP280_BFF_Examples/BNO055_BMP280_BFF_Arduino_Demo/BNO055_BMP280_BFF_Arduino_Demo.ino new file mode 100644 index 000000000..c66a288db --- /dev/null +++ b/BNO055_BMP280_BFF_Examples/BNO055_BMP280_BFF_Arduino_Demo/BNO055_BMP280_BFF_Arduino_Demo.ino @@ -0,0 +1,133 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT +// BNO055 + BMP280 BFF Demo + +#include +#include +#include +#include +#include + +Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x28, &Wire); +Adafruit_BMP280 bmp; + +void setup(void) +{ + Serial.begin(115200); + + while (!Serial) delay(10); // wait for serial port to open! + + Serial.println("Adafruit BNO055 + BMP280 BFF Demo"); + + /* Initialise the sensor */ + if (!bno.begin()) + { + /* There was a problem detecting the BNO055 ... check your connections */ + Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!"); + while (1); + } + if (!bmp.begin()) { + Serial.print("Ooops, no BMP280 detected ... Check your wiring or I2C ADDR!"); + while (1); + } + bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Operating Mode. */ + Adafruit_BMP280::SAMPLING_X2, /* Temp. oversampling */ + Adafruit_BMP280::SAMPLING_X16, /* Pressure oversampling */ + Adafruit_BMP280::FILTER_X16, /* Filtering. */ + Adafruit_BMP280::STANDBY_MS_500); /* Standby time. */ + Serial.println("Found BNO055 and BMP280 sensors!"); + Serial.println(); + delay(1000); +} + +void loop(void) +{ + //could add VECTOR_ACCELEROMETER, VECTOR_MAGNETOMETER,VECTOR_GRAVITY... + sensors_event_t orientationData , angVelocityData , linearAccelData, magnetometerData, accelerometerData, gravityData; + bno.getEvent(&orientationData, Adafruit_BNO055::VECTOR_EULER); + bno.getEvent(&angVelocityData, Adafruit_BNO055::VECTOR_GYROSCOPE); + bno.getEvent(&linearAccelData, Adafruit_BNO055::VECTOR_LINEARACCEL); + bno.getEvent(&magnetometerData, Adafruit_BNO055::VECTOR_MAGNETOMETER); + bno.getEvent(&accelerometerData, Adafruit_BNO055::VECTOR_ACCELEROMETER); + bno.getEvent(&gravityData, Adafruit_BNO055::VECTOR_GRAVITY); + Serial.println("BNO055 data:"); + printEvent(&orientationData); + printEvent(&angVelocityData); + printEvent(&linearAccelData); + printEvent(&magnetometerData); + printEvent(&accelerometerData); + printEvent(&gravityData); + Serial.println("--"); + Serial.println("BMP280 data:"); + Serial.print(F("Temperature = ")); + Serial.print(bmp.readTemperature()); + Serial.println(" *C"); + + Serial.print(F("Pressure = ")); + Serial.print(bmp.readPressure()); + Serial.println(" Pa"); + + Serial.print(F("Approx altitude = ")); + Serial.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */ + Serial.println(" m"); + + Serial.println(); + delay(2000); +} + +void printEvent(sensors_event_t* event) { + double x = -1000000, y = -1000000 , z = -1000000; //dumb values, easy to spot problem + if (event->type == SENSOR_TYPE_ACCELEROMETER) { + Serial.print("Accl:"); + x = event->acceleration.x; + y = event->acceleration.y; + z = event->acceleration.z; + } + else if (event->type == SENSOR_TYPE_ORIENTATION) { + Serial.print("Orient:"); + x = event->orientation.x; + y = event->orientation.y; + z = event->orientation.z; + } + else if (event->type == SENSOR_TYPE_MAGNETIC_FIELD) { + Serial.print("Mag:"); + x = event->magnetic.x; + y = event->magnetic.y; + z = event->magnetic.z; + } + else if (event->type == SENSOR_TYPE_GYROSCOPE) { + Serial.print("Gyro:"); + x = event->gyro.x; + y = event->gyro.y; + z = event->gyro.z; + } + else if (event->type == SENSOR_TYPE_ROTATION_VECTOR) { + Serial.print("Rot:"); + x = event->gyro.x; + y = event->gyro.y; + z = event->gyro.z; + } + else if (event->type == SENSOR_TYPE_LINEAR_ACCELERATION) { + Serial.print("Linear:"); + x = event->acceleration.x; + y = event->acceleration.y; + z = event->acceleration.z; + } + else if (event->type == SENSOR_TYPE_GRAVITY) { + Serial.print("Gravity:"); + x = event->acceleration.x; + y = event->acceleration.y; + z = event->acceleration.z; + } + else { + Serial.print("Unk:"); + } + + Serial.print("\tx= "); + Serial.print(x); + Serial.print(" |\ty= "); + Serial.print(y); + Serial.print(" |\tz= "); + Serial.println(z); +} diff --git a/BNO055_BMP280_BFF_Examples/CircuitPython/code.py b/BNO055_BMP280_BFF_Examples/CircuitPython/code.py new file mode 100644 index 000000000..ef5fcf2ca --- /dev/null +++ b/BNO055_BMP280_BFF_Examples/CircuitPython/code.py @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-License-Identifier: MIT +# +# BNO055 + BMP280 BFF Demo + +import time +import board +import adafruit_bno055 +import adafruit_bmp280 + +i2c = board.I2C() # uses board.SCL and board.SDA +bno055 = adafruit_bno055.BNO055_I2C(i2c) + +bmp280 = adafruit_bmp280.Adafruit_BMP280_I2C(i2c) +bmp280.sea_level_pressure = 1013.25 + +while True: + print(f"Temperature: {bmp280.temperature:0.1f} C") + print(f"Pressure: {bmp280.pressure:0.1f} hPa") + print(f"Altitude = {bmp280.altitude:0.2f} meters") + print(f"Accelerometer (m/s^2): {bno055.acceleration}") + print(f"Magnetometer (microteslas): {bno055.magnetic}") + print(f"Gyroscope (rad/sec): {bno055.gyro}") + print(f"Euler angle: {bno055.euler}") + print(f"Quaternion: {bno055.quaternion}") + print(f"Linear acceleration (m/s^2): {bno055.linear_acceleration}") + print(f"Gravity (m/s^2): {bno055.gravity}") + print() + + time.sleep(1) diff --git a/Breakbeat_Breadboard/wav/femvoc_330662_half_22k16b_160bpm_01.wav b/Breakbeat_Breadboard/wav/femvoc_330662_half_22k16b_160bpm.wav similarity index 100% rename from Breakbeat_Breadboard/wav/femvoc_330662_half_22k16b_160bpm_01.wav rename to Breakbeat_Breadboard/wav/femvoc_330662_half_22k16b_160bpm.wav diff --git a/EyeLights_Audio_Spectrum/EyeLights_Audio_Spectrum/.ledglasses_nrf52840.generate b/CH32V203_eInk_Calendar_Clock/.none.test.only similarity index 100% rename from EyeLights_Audio_Spectrum/EyeLights_Audio_Spectrum/.ledglasses_nrf52840.generate rename to CH32V203_eInk_Calendar_Clock/.none.test.only diff --git a/CH32V203_eInk_Calendar_Clock/CH32V203-eInk-Calendar-Clock.bin b/CH32V203_eInk_Calendar_Clock/CH32V203-eInk-Calendar-Clock.bin new file mode 100644 index 000000000..459c7c8de Binary files /dev/null and b/CH32V203_eInk_Calendar_Clock/CH32V203-eInk-Calendar-Clock.bin differ diff --git a/CH32V203_eInk_Calendar_Clock/CH32V203_eInk_Calendar_Clock.ino b/CH32V203_eInk_Calendar_Clock/CH32V203_eInk_Calendar_Clock.ino new file mode 100644 index 000000000..cb84a6a90 --- /dev/null +++ b/CH32V203_eInk_Calendar_Clock/CH32V203_eInk_Calendar_Clock.ino @@ -0,0 +1,100 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include +#include "Adafruit_TinyUSB.h" +#include "Adafruit_ThinkInk.h" +#include "RTClib.h" +#include +#include +#include +#include + +#define EPD_DC PA3 +#define EPD_CS PA2 +#define EPD_BUSY -1 // can set to -1 to not use a pin (will wait a fixed delay) +#define SRAM_CS PA1 +#define EPD_RESET -1 // can set to -1 and share with microcontroller Reset! +#define EPD_SPI &SPI // primary SPI + +// 1.54" Monochrome displays with 200x200 pixels and SSD1681 chipset +ThinkInk_154_Mono_D67 display(EPD_DC, EPD_RESET, EPD_CS, SRAM_CS, EPD_BUSY, EPD_SPI); + +RTC_DS3231 rtc; + +char daysOfTheWeek[7][4] = {"SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"}; +char monthsOfYear[13][4] = {"NULL", "JAN", "FEB", "MAR", "APR", "MAY", "JUN", "JUL", "AUG", "SEP", "OCT", "NOV", "DEC"}; + +bool start = true; + +String lastTimeStr = "00:00"; + +void setup() { + Serial.begin(115200); + + /*while (!Serial) { + delay(10); + }*/ + Serial.println("eInk Calendar & Clock with CH32V203"); + SPI.begin(); + Serial.println("SPI started"); + pinMode(EPD_CS, OUTPUT); + digitalWrite(EPD_CS, HIGH); + + Wire.begin(); + Serial.println("Wire started"); + Serial.println("starting display, might take a bit.."); + display.begin(THINKINK_MONO); + Serial.println("display started"); + + while (! rtc.begin()) { + Serial.println("Couldn't find RTC"); + delay(10); + } +} + +void loop() { + Serial.println("we did it!"); + DateTime now = rtc.now(); + Serial.println("read rtc"); + char timeChar[6]; + sprintf(timeChar, "%02d:%02d", now.hour(), now.minute()); + String timeStr = String(timeChar); + String monthStr = monthsOfYear[now.month()]; + String dateStr = String(now.day()); + String yearStr = String(now.year()); + String dayOfWeekStr = daysOfTheWeek[now.dayOfTheWeek()]; + Serial.println(timeStr); + int16_t x1, y1; + uint16_t w, h; + if (lastTimeStr != timeStr) { + display.clearBuffer(); + display.fillRect(0, 0, 200, 60, EPD_BLACK); + display.drawRect(0, 0, 200, 170, EPD_BLACK); + display.setTextColor(EPD_WHITE); + display.setFont(&FreeSans24pt7b); + display.getTextBounds(dayOfWeekStr.c_str(), 0, 0, &x1, &y1, &w, &h); + display.setCursor((200 - w) / 2, (60 - h) / 2 + h); + display.println(dayOfWeekStr); + display.setTextColor(EPD_BLACK); + display.getTextBounds(dateStr.c_str(), 0, 0, &x1, &y1, &w, &h); + display.setCursor((200 - w) / 2, (170 - h) / 2 + h + 28); + display.println(dateStr); + display.setFont(&FreeSans18pt7b); + display.getTextBounds(monthStr.c_str(), 0, 0, &x1, &y1, &w, &h); + display.setCursor((200 - w) / 2, (60 + h) + 3); + display.println(monthStr); + display.getTextBounds(yearStr.c_str(), 0, 0, &x1, &y1, &w, &h); + display.setCursor((200 - w) / 2, (170 - h) - 5 + h); + display.println(yearStr); + display.setFont(&FreeSans12pt7b); + display.getTextBounds(timeStr.c_str(), 0, 0, &x1, &y1, &w, &h); + display.setCursor((200 - w) / 2, (200 - h) - 5 + h); + display.println(timeStr); + display.display(); + lastTimeStr = timeStr; + } + delay(30000); +} diff --git a/CH9328_CPython_Demo/code.py b/CH9328_CPython_Demo/code.py new file mode 100644 index 000000000..7e861c7a6 --- /dev/null +++ b/CH9328_CPython_Demo/code.py @@ -0,0 +1,75 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import sys +import serial +import keyboard + +port = '/dev/ttyUSB0' # Replace with your actual serial port + +# Define a mapping for special characters when shift is pressed +SHIFTED_KEYS = { + '1': '!', '2': '@', '3': '#', '4': '$', '5': '%', + '6': '^', '7': '&', '8': '*', '9': '(', '0': ')', + '`': '~', '-': '_', '=': '+', '[': '{', ']': '}', + '\\': '|', ';': ':', "'": '"', ',': '<', '.': '>', + '/': '?' +} + +def send_key(serial_port, key): + """ + Send a key press to the CH9328 via UART. + + Parameters: + serial_port (serial.Serial): The serial port connection. + key (str): The key to send. + """ + serial_port.write(key.encode('ascii')) + serial_port.flush() + +def send_empty_report(serial_port): + """ + Send an empty HID report to reset the state of the device. + + Parameters: + serial_port (serial.Serial): The serial port connection. + """ + try: + empty_report = bytearray([0] * 8) + serial_port.write(empty_report) + serial_port.flush() + except serial.SerialException as e: + print(f"Failed to send empty report: {e}") + +def main(): + # Configure the serial connection + baudrate = 9600 # Default baud rate for CH9328 in Mode 1 + timeout = 1 + + with serial.Serial(port, baudrate, timeout=timeout) as ser: + + print("Listening for keyboard inputs. Press 'ESC' to exit.") + + def on_key_event(event): + if event.event_type == 'down': + key = event.name + if len(key) == 1: # Only process single character keys + if keyboard.is_pressed('shift'): # Check if shift is pressed + key = SHIFTED_KEYS.get(key, key.upper()) + send_key(ser, key) + elif key == 'space': + send_key(ser, ' ') + elif key == 'enter': + send_key(ser, '\n') + send_empty_report(ser) + + # Hook the keyboard event + keyboard.hook(on_key_event) + + # Wait for ESC to exit + keyboard.wait('esc') + +if __name__ == "__main__": + main() + sys.exit() diff --git a/CLUE_Light_Painter/bmp2led.py b/CLUE_Light_Painter/bmp2led.py index 26259dde1..d5c02ed86 100755 --- a/CLUE_Light_Painter/bmp2led.py +++ b/CLUE_Light_Painter/bmp2led.py @@ -339,6 +339,8 @@ class BMP2LED: # Accumulated error vals will all now be 0.0 to <2.0. # Quantizing err into a new uint8 ndarray, all values # will be 0 or 1. + # Convert float values in err to integers + err = [int(min(max(0, e), 255)) for e in err] err_bits = ulab.numpy.array(err, dtype=ulab.numpy.uint8) # Add the 1's back into 'got', increasing the # brightness of certain pixels by 1. Because the max diff --git a/CLUE_Light_Painter/code.py b/CLUE_Light_Painter/code.py index 2346a0506..74bd2b305 100755 --- a/CLUE_Light_Painter/code.py +++ b/CLUE_Light_Painter/code.py @@ -230,7 +230,7 @@ class ClueLightPainter: board.DISPLAY.root_group = group sleep(4) - board.DISPLAY.show(displayio.Group()) # Clear display + board.DISPLAY.root_group = displayio.Group() # Clear display self.clear_strip() # LEDs off diff --git a/CLUE_Sensor_Plotter/plotter.py b/CLUE_Sensor_Plotter/plotter.py index 9f9dfe242..a24fcfede 100644 --- a/CLUE_Sensor_Plotter/plotter.py +++ b/CLUE_Sensor_Plotter/plotter.py @@ -444,7 +444,7 @@ class Plotter: if self._displayio_graph is None: self._displayio_graph = self._make_empty_graph(tg_and_plot=tg_and_plot) - self._output.show(self._displayio_graph) + self._output.root_group = self._displayio_graph def display_off(self): pass diff --git a/CNC_MacroPad/code.py b/CNC_MacroPad/code.py new file mode 100644 index 000000000..2c39da40a --- /dev/null +++ b/CNC_MacroPad/code.py @@ -0,0 +1,141 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import board +import keypad +import rotaryio +import neopixel +import usb_hid +from adafruit_hid.keyboard import Keyboard +from adafruit_hid.keycode import Keycode +from adafruit_hid.mouse import Mouse + +mouse = Mouse(usb_hid.devices) +# neopixel colors +RED = (255, 0, 0) +ORANGE = (255, 127, 0) +YELLOW = (255, 255, 0) +GREEN = (0, 255, 0) +AQUA = (0, 255, 255) +BLUE = (0, 0, 255) +PURPLE = (127, 0, 255) +PINK = (255, 0, 255) +OFF = (50, 50, 50) +# axis states selected with keys 9-11 +axis_states = [0, "x", "y", "z"] +state = axis_states[0] +# keymap for key matrix +keymap = { + (0): (axis_states[0], (Keycode.COMMAND, Keycode.COMMA), BLUE), # SETTINGS + (1): (axis_states[0], (Keycode.COMMAND, Keycode.P), ORANGE), # SLICE MODEL + (2): (axis_states[0], (Keycode.COMMAND, Keycode.D), RED), # CLEAR BED + + (3): (axis_states[0], [Keycode.T], GREEN), # MOVE + (4): (axis_states[0], [Keycode.S], AQUA), # SCALE + (5): (axis_states[0], [Keycode.R], BLUE), # ROTATE + + (6): (axis_states[0], [Keycode.M], AQUA), # MIRROR + (7): (axis_states[0], [Keycode.E], PURPLE), # SUPPORT BLOCKERS + (8): (axis_states[0], [Keycode.I], PINK), # TABS + + (9): (axis_states[1], None, RED), # SET X-AXIS STATE + (10): (axis_states[2], None, GREEN), # SET Y-AXIS STATE + (11): (axis_states[3], None, BLUE), # SET Z-AXIS STATE +} +# keymap for encoder based on state; pos = [0], neg = [1] +encoder_map = { + ("x"): ([Keycode.RIGHT_ARROW], [Keycode.LEFT_ARROW]), + ("y"): ([Keycode.UP_ARROW], [Keycode.DOWN_ARROW]), + # ("z"): ([Keycode.W], [Keycode.S]), +} +# make a keyboard +kbd = Keyboard(usb_hid.devices) +# key matrix +COLUMNS = 3 +ROWS = 4 +keys = keypad.KeyMatrix( + row_pins=(board.D12, board.D11, board.D10, board.D9), + column_pins=(board.A0, board.A1, board.A2), + columns_to_anodes=False, +) +# neopixels and key num to pixel function +pixels = neopixel.NeoPixel(board.D5, 12, brightness=0.3) +def key_to_pixel_map(key_number): + row = key_number // COLUMNS + column = key_number % COLUMNS + if row % 2 == 1: + column = COLUMNS - column - 1 + return row * COLUMNS + column +pixels.fill(OFF) # Begin with pixels off. + +# make an encoder +encoder = rotaryio.IncrementalEncoder(board.D24, board.D25) +last_position = 0 + +while True: + # poll for key event + key_event = keys.events.get() + # get position of encoder + position = encoder.position + # if position changes.. + if position != last_position: + # ..and it increases.. + if position > last_position: + # ..and state is x: + if state is axis_states[1]: + kbd.press(*encoder_map[state][0]) + # ..and state is y: + if state is axis_states[2]: + kbd.press(*encoder_map[state][0]) + # ..and state is z: + if state is axis_states[3]: + mouse.move(wheel=-1) + # ..and it decreases.. + if position < last_position: + # ..and state is x: + if state is axis_states[1]: + kbd.press(*encoder_map[state][1]) + # ..and state is y: + if state is axis_states[2]: + kbd.press(*encoder_map[state][1]) + # ..and state is z: + if state is axis_states[3]: + mouse.move(wheel=1) + # print(position) + # release all keys + kbd.release_all() + # update last_position + last_position = position + # if a key event.. + if key_event: + # print(key_event) + # ..and it's pressed.. + if key_event.pressed: + # ..and it's keys 0-8, send key presses from keymap: + if keymap[key_event.key_number][0] is axis_states[0]: + state = axis_states[0] + kbd.press(*keymap[key_event.key_number][1]) + # ..and it's key 9, set state to x + if keymap[key_event.key_number][0] is axis_states[1]: + state = axis_states[1] + pixels[key_to_pixel_map(10)] = OFF + pixels[key_to_pixel_map(11)] = OFF + # ..and it's key 10, set state to y + if keymap[key_event.key_number][0] is axis_states[2]: + state = axis_states[2] + pixels[key_to_pixel_map(9)] = OFF + pixels[key_to_pixel_map(11)] = OFF + # ..and it's key 11, set state to z + if keymap[key_event.key_number][0] is axis_states[3]: + state = axis_states[3] + pixels[key_to_pixel_map(9)] = OFF + pixels[key_to_pixel_map(10)] = OFF + # turn on neopixel for key with color from keymap + pixels[key_to_pixel_map(key_event.key_number)] = keymap[key_event.key_number][2] + # ..and it's released.. + if key_event.released: + # if it's key 0-8, release the key press and turn off neopixel + if keymap[key_event.key_number][0] is axis_states[0]: + kbd.release(*keymap[key_event.key_number][1]) + pixels.fill(OFF) diff --git a/CPB_Keybutton_BLE/code.py b/CPB_Keybutton_BLE/code.py index 05c9d27fb..4ab78df2d 100644 --- a/CPB_Keybutton_BLE/code.py +++ b/CPB_Keybutton_BLE/code.py @@ -47,6 +47,8 @@ hid = HIDService() device_info = DeviceInfoService(software_revision=adafruit_ble.__version__, manufacturer="Adafruit Industries") advertisement = ProvideServicesAdvertisement(hid) +# Advertise as "Keyboard" (0x03C1) icon when pairing +# https://www.bluetooth.com/specifications/assigned-numbers/ advertisement.appearance = 961 scan_response = Advertisement() scan_response.complete_name = "CircuitPython HID" diff --git a/Cartoon_Character_Clock/clock_center.bmp b/Cartoon_Character_Clock/clock_center.bmp new file mode 100644 index 000000000..48ea0c80f Binary files /dev/null and b/Cartoon_Character_Clock/clock_center.bmp differ diff --git a/Cartoon_Character_Clock/clock_long_hand.bmp b/Cartoon_Character_Clock/clock_long_hand.bmp new file mode 100644 index 000000000..6b5b71785 Binary files /dev/null and b/Cartoon_Character_Clock/clock_long_hand.bmp differ diff --git a/Cartoon_Character_Clock/clock_short_hand.bmp b/Cartoon_Character_Clock/clock_short_hand.bmp new file mode 100644 index 000000000..aacdb1699 Binary files /dev/null and b/Cartoon_Character_Clock/clock_short_hand.bmp differ diff --git a/Cartoon_Character_Clock/code.py b/Cartoon_Character_Clock/code.py new file mode 100644 index 000000000..d72e540b3 --- /dev/null +++ b/Cartoon_Character_Clock/code.py @@ -0,0 +1,133 @@ +# SPDX-FileCopyrightText: 2025 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +Cartoon Character Clock + +This project features an analog clock face rendered on a round display. +The art and songs are inspired by an early 20th-century public domain +cartoon. + +""" +import os +import time +import board +from adafruit_display_analogclock import AnalogClock +from adafruit_gc9a01a import GC9A01A +import rtc +import socketpool +import displayio +from fourwire import FourWire +import adafruit_ntp +import wifi +import audiobusio +from audiomp3 import MP3Decoder + +# Set the desired offset from UTC time here. +# US Eastern Standard Time is -5 +# US Eastern Daylight Time is -4 +UTC_OFFSET = -5 + +# enable or disable the hourly chime jingle +HOURLY_CHIME = True + +# Set to a tuple containing hour and minute values to +# enable the alarm e.g. 13, 25 will play the alarm at +# 1:25 pm adjusted for the given UTC_OFFSET. +ALARM_TIME = None +#ALARM_TIME = (13, 25) + +# WiFi Setup +# Get wifi AP credentials from a settings.toml file +wifi_ssid = os.getenv("CIRCUITPY_WIFI_SSID") +wifi_password = os.getenv("CIRCUITPY_WIFI_PASSWORD") +if wifi_ssid is None: + print("WiFi credentials are kept in settings.toml, please add them there!") + raise ValueError("SSID not found in environment variables") + +try: + wifi.radio.connect(wifi_ssid, wifi_password) +except ConnectionError: + print("Failed to connect to WiFi with provided credentials") + raise + +# pylint: disable=unsubscriptable-object + +if HOURLY_CHIME or ALARM_TIME is not None: + # Audio Setup + audio = audiobusio.I2SOut(board.A2, board.A1, board.A0) + songs = ["song_1.mp3", "song_2.mp3"] + mp3 = open(songs[0], "rb") + decoder = MP3Decoder(mp3) + +# Display Setup +spi = board.SPI() +tft_cs = board.TX +tft_dc = board.RX + +displayio.release_displays() +display_bus = FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=None) +display = GC9A01A(display_bus, width=240, height=240) +display.rotation = 90 + +# Sync time from NTP server +pool = socketpool.SocketPool(wifi.radio) +ntp = adafruit_ntp.NTP(pool, server="time.nist.gov", tz_offset=0, cache_seconds=3600) +rtc.RTC().datetime = ntp.datetime + +# Initialize the clock face +clockface = AnalogClock( + "clock_short_hand.bmp", + "clock_long_hand.bmp", + (120, 120), 106, number_label_scale=2, + background_color=0x989a97, + background_img_file="clock_center.bmp", + background_img_anchor_point=(0.5,0.5), + background_img_anchored_position=(display.width//2, display.height//2 - 2) +) + +# set the clockface to show on the display +display.root_group = clockface + +print(f"current time {time.localtime().tm_hour + UTC_OFFSET}:{time.localtime().tm_min}") +cur_hour = time.localtime().tm_hour + UTC_OFFSET +cur_minute = time.localtime().tm_min + +clockface.set_time(cur_hour, cur_minute) + +while True: + # If we need to update the clock hands + if cur_hour != time.localtime().tm_hour + UTC_OFFSET or cur_minute != time.localtime().tm_min: + # store current values to comapre with next iteration + cur_hour = time.localtime().tm_hour + UTC_OFFSET + cur_minute = time.localtime().tm_min + + # update the clock face + clockface.set_time(cur_hour, cur_minute) + + # if the hourly chime is enabled, and it's the top of the hour + if HOURLY_CHIME and cur_minute == 0: + # play the hour chime jingle + audio.play(decoder) + while audio.playing: + pass + + # if the alarm is enabled and the current time is what + # it was set to. + if ALARM_TIME is not None and \ + cur_hour == ALARM_TIME[0] and cur_minute == ALARM_TIME[1]: + + # open the alarm song file + decoder.file = open("song_2.mp3", "rb") + + # play the alarm song twice + for i in range(2): + audio.play(decoder) + while audio.playing: + pass + time.sleep(0.5) + + # re-open the hourly chime file + decoder.file = open("song_1.mp3", "rb") + + time.sleep(3) diff --git a/Cartoon_Character_Clock/song_1.mp3 b/Cartoon_Character_Clock/song_1.mp3 new file mode 100644 index 000000000..e046ba007 Binary files /dev/null and b/Cartoon_Character_Clock/song_1.mp3 differ diff --git a/Cartoon_Character_Clock/song_2.mp3 b/Cartoon_Character_Clock/song_2.mp3 new file mode 100644 index 000000000..e7d70e82b Binary files /dev/null and b/Cartoon_Character_Clock/song_2.mp3 differ diff --git a/ChatGPT_Bear/assistant.py b/ChatGPT_Bear/assistant.py index e5dae68ee..6c7530b4a 100644 --- a/ChatGPT_Bear/assistant.py +++ b/ChatGPT_Bear/assistant.py @@ -5,21 +5,22 @@ import threading import os import sys - -from datetime import datetime, timedelta -from queue import Queue import time import random +import configparser from tempfile import NamedTemporaryFile import azure.cognitiveservices.speech as speechsdk -import speech_recognition as sr -import openai +from openai import OpenAI import board import digitalio from adafruit_motorkit import MotorKit +from listener import Listener + +API_KEYS_FILE = "~/keys.txt" + # ChatGPT Parameters SYSTEM_ROLE = ( "You are a helpful voice assistant in the form of a talking teddy bear" @@ -34,7 +35,6 @@ DEVICE_ID = None # Speech Recognition Parameters ENERGY_THRESHOLD = 1000 # Energy level for mic to detect -PHRASE_TIMEOUT = 3.0 # Space between recordings for sepating phrases RECORD_TIMEOUT = 30 # Motor Parameters @@ -44,32 +44,60 @@ SPEECH_VARIANCE = 0.1 # Higher allows more mouth movement variance. # It pauses for BASE_MOUTH_DURATION ± SPEECH_VARIANCE MOTOR_DUTY_CYCLE = 1.0 # Lower provides less power to the motors -# Import keys from environment variables -openai.api_key = os.environ.get("OPENAI_API_KEY") -speech_key = os.environ.get("SPEECH_KEY") -service_region = os.environ.get("SPEECH_REGION") +# Do some checks and Import API keys from API_KEYS_FILE +config = configparser.ConfigParser() -if openai.api_key is None or speech_key is None or service_region is None: - print( - "Please set the OPENAI_API_KEY, SPEECH_KEY, and SPEECH_REGION environment variables first." - ) - sys.exit(1) +username = os.environ["USER"] +user_homedir = os.path.expanduser(f"~{username}") +API_KEYS_FILE = API_KEYS_FILE.replace("~", user_homedir) + +def get_config_value(section, key, min_length=None): + if not config.has_section(section): + print("Please make sure API_KEYS_FILE points to " + f"a valid file and has an [{section}] section.") + sys.exit(1) + if key not in config[section]: + print( + f"Please make sure your API keys file contains an {key} under the {section} section." + ) + sys.exit(1) + value = config[section][key] + if min_length and len(value) < min_length: + print(f"Please set {key} in your API keys file with a valid key.") + sys.exit(1) + return config[section][key] + +print(os.path.expanduser(API_KEYS_FILE)) +config.read(os.path.expanduser(API_KEYS_FILE)) +openai = OpenAI( + # This is the default and can be omitted + api_key=get_config_value("openai", "OPENAI_API_KEY", 10) +) + +speech_key = get_config_value("azure", "SPEECH_KEY", 15) +service_region = get_config_value("azure", "SPEECH_REGION") speech_config = speechsdk.SpeechConfig(subscription=speech_key, region=service_region) speech_config.speech_synthesis_voice_name = AZURE_SPEECH_VOICE def sendchat(prompt): - completion = openai.ChatCompletion.create( + response = "" + stream = openai.chat.completions.create( model=CHATGPT_MODEL, messages=[ {"role": "system", "content": SYSTEM_ROLE}, {"role": "user", "content": prompt}, ], + stream=True, ) # Send the heard text to ChatGPT and return the result - return completion.choices[0].message.content + for chunk in stream: + if chunk.choices[0].delta.content is not None: + response += chunk.choices[0].delta.content + # Send the heard text to ChatGPT and return the result + return response def transcribe(wav_data): # Read the transcription. @@ -88,69 +116,6 @@ def transcribe(wav_data): return "I wasn't able to understand you. Please repeat that." -class Listener: - def __init__(self): - self.listener_handle = None - self.recognizer = sr.Recognizer() - self.recognizer.energy_threshold = ENERGY_THRESHOLD - self.recognizer.dynamic_energy_threshold = False - self.recognizer.pause_threshold = 1 - self.last_sample = bytes() - self.phrase_time = datetime.utcnow() - self.phrase_timeout = PHRASE_TIMEOUT - self.phrase_complete = False - # Thread safe Queue for passing data from the threaded recording callback. - self.data_queue = Queue() - self.mic_dev_index = None - - def listen(self): - if not self.listener_handle: - with sr.Microphone() as source: - print(source.stream) - self.recognizer.adjust_for_ambient_noise(source) - audio = self.recognizer.listen(source, timeout=RECORD_TIMEOUT) - data = audio.get_raw_data() - self.data_queue.put(data) - - def record_callback(self, _, audio: sr.AudioData) -> None: - # Grab the raw bytes and push it into the thread safe queue. - data = audio.get_raw_data() - self.data_queue.put(data) - - def speech_waiting(self): - return not self.data_queue.empty() - - def get_speech(self): - if self.speech_waiting(): - return self.data_queue.get() - return None - - def get_audio_data(self): - now = datetime.utcnow() - if self.speech_waiting(): - self.phrase_complete = False - if self.phrase_time and now - self.phrase_time > timedelta( - seconds=self.phrase_timeout - ): - self.last_sample = bytes() - self.phrase_complete = True - self.phrase_time = now - - # Concatenate our current audio data with the latest audio data. - while self.speech_waiting(): - data = self.get_speech() - self.last_sample += data - - # Use AudioData to convert the raw data to wav data. - with sr.Microphone() as source: - audio_data = sr.AudioData( - self.last_sample, source.SAMPLE_RATE, source.SAMPLE_WIDTH - ) - return audio_data - - return None - - class Bear: def __init__(self, azure_speech_config): kit = MotorKit(i2c=board.I2C()) @@ -234,15 +199,15 @@ class Bear: if cancellation_details.reason == speechsdk.CancellationReason.Error: print("Error details: {}".format(cancellation_details.error_details)) - def main(): - listener = Listener() + listener = Listener(openai.api_key, ENERGY_THRESHOLD, RECORD_TIMEOUT) bear = Bear(speech_config) transcription = [""] bear.speak( "Hello there! Just give my left foot a squeeze if you would like to get my attention." ) + while True: try: # If button is pressed, start listening @@ -250,25 +215,19 @@ def main(): bear.speak("How may I help you?") listener.listen() - # Pull raw recorded audio from the queue. if listener.speech_waiting(): - audio_data = listener.get_audio_data() bear.speak("Let me think about that") bear.move_arms(hide=True) - text = transcribe(audio_data.get_wav_data()) + text = listener.recognize() if text: - if listener.phrase_complete: - transcription.append(text) - print(f"Phrase Complete. Sent '{text}' to ChatGPT.") - chat_response = sendchat(text) - transcription.append(f"> {chat_response}") - print("Got response from ChatGPT. Beginning speech synthesis.") - bear.move_arms(hide=False) - bear.speak(chat_response) - else: - print("Partial Phrase...") - transcription[-1] = text + transcription.append(text) + print(f"Phrase Complete. Sent '{text}' to ChatGPT.") + chat_response = sendchat(text) + transcription.append(f"> {chat_response}") + print("Got response from ChatGPT. Beginning speech synthesis.") + bear.move_arms(hide=False) + bear.speak(chat_response) os.system("clear") for line in transcription: diff --git a/ChatGPT_Bear/keys.txt b/ChatGPT_Bear/keys.txt new file mode 100644 index 000000000..30eace593 --- /dev/null +++ b/ChatGPT_Bear/keys.txt @@ -0,0 +1,6 @@ +[openai] +OPENAI_API_KEY = sk-... + +[azure] +SPEECH_KEY = 4f1d...02a9 +SPEECH_REGION = eastus \ No newline at end of file diff --git a/ChatGPT_Bear/listener.py b/ChatGPT_Bear/listener.py new file mode 100644 index 000000000..260f50c2b --- /dev/null +++ b/ChatGPT_Bear/listener.py @@ -0,0 +1,84 @@ +# SPDX-FileCopyrightText: 2023 Melissa LeBlanc-Williams for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time + +import speech_recognition as sr + +class Listener: + def __init__( + self, api_key, energy_threshold=300, record_timeout=30 + ): + self.listener_handle = None + self.microphone = sr.Microphone() + self.recognizer = sr.Recognizer() + self.recognizer.energy_threshold = energy_threshold + self.recognizer.dynamic_energy_threshold = False + self.recognizer.pause_threshold = 1 + self.phrase_time = time.monotonic() + with self.microphone as source: + self.recognizer.adjust_for_ambient_noise( + source + ) # we only need to calibrate once, before we start listening + self.record_timeout = record_timeout + self._audio = None + self.listener_handle = None + self.api_key = api_key + + def listen(self, ready_callback=None): + print("Start listening...") + self._start_listening() + if ready_callback: + ready_callback() + + while ( + self.listener_handle and not self.speech_waiting() + ): + time.sleep(0.1) + self.stop_listening() + + def _save_audio_callback(self, _, audio): + print("Saving audio") + self._audio = audio + + def _start_listening(self): + if not self.listener_handle: + self.listener_handle = self.recognizer.listen_in_background( + self.microphone, + self._save_audio_callback, + phrase_time_limit=self.record_timeout, + ) + + def stop_listening(self, wait_for_stop=False): + if self.listener_handle: + self.listener_handle(wait_for_stop=wait_for_stop) + self.listener_handle = None + print("Stop listening...") + + def is_listening(self): + return self.listener_handle is not None + + def speech_waiting(self): + return self._audio is not None + + def recognize(self): + if self._audio: + # Transcribe the audio data to text using Whisper + print("Recognizing...") + attempts = 0 + while attempts < 3: + try: + result = self.recognizer.recognize_whisper_api( + self._audio, api_key=self.api_key + ) + self._audio = None + return result.strip() + except sr.RequestError as e: + print(f"Error: {e}") + time.sleep(3) + attempts += 1 + print("Retry attempt: ", attempts) + print("Failed to recognize") + return None + return None diff --git a/EyeLights_Bluetooth_Scroller/.ledglasses_nrf52840.generate b/Cheekmate/Arduino/Cheekmate/.none.test.only similarity index 100% rename from EyeLights_Bluetooth_Scroller/.ledglasses_nrf52840.generate rename to Cheekmate/Arduino/Cheekmate/.none.test.only diff --git a/CircuitPython_CLUEbot/robot.py b/CircuitPython_CLUEbot/robot.py index 3fb7c543c..5d9bcf03b 100755 --- a/CircuitPython_CLUEbot/robot.py +++ b/CircuitPython_CLUEbot/robot.py @@ -66,7 +66,7 @@ class Robot: def _init_display(self): self.display = board.DISPLAY self.display_group = displayio.Group() - self.display.show(self.display_group) + self.display.root_group = self.display_group self.shape_color = 0 self.bg_color = 0xFFFF00 rect = vectorio.Rectangle( diff --git a/CircuitPython_Day_2024_Projects/Blinka_NeoPixel_Countdown/code.py b/CircuitPython_Day_2024_Projects/Blinka_NeoPixel_Countdown/code.py new file mode 100644 index 000000000..8a60f454d --- /dev/null +++ b/CircuitPython_Day_2024_Projects/Blinka_NeoPixel_Countdown/code.py @@ -0,0 +1,78 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import os +import time +import wifi +import microcontroller +import board +import neopixel +import adafruit_connection_manager +import adafruit_requests +from adafruit_io.adafruit_io import IO_HTTP +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff + +timezone = "America/New_York" +color = 0xFF00FF +# The time of the thing! +EVENT_YEAR = 2024 +EVENT_MONTH = 8 +EVENT_DAY = 16 +EVENT_HOUR = 0 +EVENT_MINUTE = 0 +# we'll make a python-friendly structure +event_time = time.struct_time((EVENT_YEAR, EVENT_MONTH, EVENT_DAY, + EVENT_HOUR, EVENT_MINUTE, 0, # we don't track seconds + -1, -1, False)) # we dont know day of week/year or DST + +print("Connecting to WiFi...") +wifi.radio.connect( + os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD") +) +pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio) +ssl_context = adafruit_connection_manager.get_radio_ssl_context(wifi.radio) +requests = adafruit_requests.Session(pool, ssl_context) +io = IO_HTTP( + os.getenv("AIO_USERNAME"), os.getenv("AIO_KEY"), requests +) + +pixel_pin = board.SCL1 +pixel_num = 16 +pixels = neopixel.NeoPixel(pixel_pin, n = pixel_num, brightness=1, auto_write=True) +pixel_length = 0 +last_length = -1 + +refresh_clock = ticks_ms() +refresh_timer = 3600 * 1000 # 1 hour +first_run = True +finished = False + +while True: + if not finished: + if ticks_diff(ticks_ms(), refresh_clock) >= refresh_timer or first_run: + try: + print("Getting time from internet!") + now = time.struct_time(io.receive_time(timezone)) + print(now) + total_seconds = time.mktime(now) + remaining = time.mktime(event_time) - total_seconds + if remaining < 0: + pixel_length = pixel_num + 1 + finished = True + else: + if now.tm_mon == EVENT_MONTH: + pixel_length = now.tm_mday % (pixel_num + 1) + refresh_clock = ticks_add(refresh_clock, refresh_timer) + except Exception as e: # pylint: disable=broad-except + print("Some error occured, retrying via reset in 15 seconds! - ", e) + time.sleep(15) + microcontroller.reset() + if last_length != pixel_length: + if not pixel_length: + pixels.fill(0x000000) + else: + for i in range(pixel_length): + pixels[i] = color + last_length = pixel_length + first_run = False diff --git a/CircuitPython_Day_2024_Projects/Feather_DVI_Countdown/Helvetica-Bold-16.pcf b/CircuitPython_Day_2024_Projects/Feather_DVI_Countdown/Helvetica-Bold-16.pcf new file mode 100644 index 000000000..deb9092d1 Binary files /dev/null and b/CircuitPython_Day_2024_Projects/Feather_DVI_Countdown/Helvetica-Bold-16.pcf differ diff --git a/CircuitPython_Day_2024_Projects/Feather_DVI_Countdown/code.py b/CircuitPython_Day_2024_Projects/Feather_DVI_Countdown/code.py new file mode 100644 index 000000000..c20761273 --- /dev/null +++ b/CircuitPython_Day_2024_Projects/Feather_DVI_Countdown/code.py @@ -0,0 +1,98 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import displayio +import picodvi +import board +import framebufferio +from adafruit_bitmap_font import bitmap_font +from adafruit_display_text import label +from adafruit_pcf8523.pcf8523 import PCF8523 +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff + +EVENT_YEAR = 2024 +EVENT_MONTH = 8 +EVENT_DAY = 16 +EVENT_HOUR = 0 +EVENT_MINUTE = 0 +# we'll make a python-friendly structure +event_time = time.struct_time((EVENT_YEAR, EVENT_MONTH, EVENT_DAY, + EVENT_HOUR, EVENT_MINUTE, 0, # we don't track seconds + -1, -1, False)) # we dont know day of week/year or DST + +# check for DVI Feather with built-in display +if 'DISPLAY' in dir(board): + display = board.DISPLAY + +# check for DVI feather without built-in display +elif 'CKP' in dir(board): + displayio.release_displays() + fb = picodvi.Framebuffer(320, 240, + clk_dp=board.CKP, clk_dn=board.CKN, + red_dp=board.D0P, red_dn=board.D0N, + green_dp=board.D1P, green_dn=board.D1N, + blue_dp=board.D2P, blue_dn=board.D2N, + color_depth=8) + display = framebufferio.FramebufferDisplay(fb) +# otherwise assume Pico +else: + displayio.release_displays() + fb = picodvi.Framebuffer(320, 240, + clk_dp=board.GP12, clk_dn=board.GP13, + red_dp=board.GP10, red_dn=board.GP11, + green_dp=board.GP8, green_dn=board.GP9, + blue_dp=board.GP6, blue_dn=board.GP7, + color_depth=8) + display = framebufferio.FramebufferDisplay(fb) + +i2c = board.I2C() +rtc = PCF8523(i2c) +set_clock = False +if set_clock: + # year, mon, date, hour, min, sec, wday, yday, isdst + t = time.struct_time((2024, 8, 1, 16, 26, 00, 0, -1, -1)) + print("Setting time to:", t) + rtc.datetime = t + print() +# variable to hold RTC datetime +t = rtc.datetime + +pink = 0xf1078e +purple = 0x673192 +aqua = 0x19beed +group = displayio.Group() +my_font = bitmap_font.load_font("/Helvetica-Bold-16.pcf") +clock_area = label.Label(my_font, text="00:00:00:00", color=pink) +clock_area.anchor_point = (0.0, 1.0) +clock_area.anchored_position = (display.width / 2 - clock_area.width / 2, + display.height - (clock_area.height + 20)) +text1 = label.Label(my_font, text="Starting In:", color=aqua) +text1.anchor_point = (0.0, 0.0) +text1.anchored_position = (display.width / 2 - text1.width / 2, + display.height - (clock_area.height + text1.height + 35)) + +blinka_bitmap = displayio.OnDiskBitmap("/cpday_dvi.bmp") +blinka_grid = displayio.TileGrid(blinka_bitmap, pixel_shader=blinka_bitmap.pixel_shader) +group.append(blinka_grid) +group.append(text1) +group.append(clock_area) +display.root_group = group + +clock_clock = ticks_ms() +clock_timer = 1000 +while True: + if ticks_diff(ticks_ms(), clock_clock) >= clock_timer: + t = rtc.datetime + remaining = time.mktime(event_time) - time.mktime(t) + secs_remaining = remaining % 60 + remaining //= 60 + mins_remaining = remaining % 60 + remaining //= 60 + hours_remaining = remaining % 24 + remaining //= 24 + days_remaining = remaining + clock_area.text = (f"{days_remaining:0>2}:{hours_remaining:0>2}" + + f":{mins_remaining:0>2}:{secs_remaining:0>2}") + clock_clock = ticks_add(clock_clock, clock_timer) diff --git a/CircuitPython_Day_2024_Projects/Feather_DVI_Countdown/cpday_dvi.bmp b/CircuitPython_Day_2024_Projects/Feather_DVI_Countdown/cpday_dvi.bmp new file mode 100644 index 000000000..097bbbf0e Binary files /dev/null and b/CircuitPython_Day_2024_Projects/Feather_DVI_Countdown/cpday_dvi.bmp differ diff --git a/CircuitPython_Day_2024_Projects/Feather_TFT_NTP_Countdown/Helvetica-Bold-16.pcf b/CircuitPython_Day_2024_Projects/Feather_TFT_NTP_Countdown/Helvetica-Bold-16.pcf new file mode 100644 index 000000000..deb9092d1 Binary files /dev/null and b/CircuitPython_Day_2024_Projects/Feather_TFT_NTP_Countdown/Helvetica-Bold-16.pcf differ diff --git a/CircuitPython_Day_2024_Projects/Feather_TFT_NTP_Countdown/code.py b/CircuitPython_Day_2024_Projects/Feather_TFT_NTP_Countdown/code.py new file mode 100644 index 000000000..d00377525 --- /dev/null +++ b/CircuitPython_Day_2024_Projects/Feather_TFT_NTP_Countdown/code.py @@ -0,0 +1,86 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import os +import time +import wifi +import board +import displayio +import socketpool +import microcontroller +from adafruit_bitmap_font import bitmap_font +from adafruit_display_text import bitmap_label +import adafruit_ntp +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff + +timezone = -4 +# The time of the thing! +EVENT_YEAR = 2024 +EVENT_MONTH = 8 +EVENT_DAY = 16 +EVENT_HOUR = 0 +EVENT_MINUTE = 0 +# we'll make a python-friendly structure +event_time = time.struct_time((EVENT_YEAR, EVENT_MONTH, EVENT_DAY, + EVENT_HOUR, EVENT_MINUTE, 0, # we don't track seconds + -1, -1, False)) # we dont know day of week/year or DST + +wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD")) +pool = socketpool.SocketPool(wifi.radio) +ntp = adafruit_ntp.NTP(pool, tz_offset=timezone, cache_seconds=3600) + +display = board.DISPLAY +group = displayio.Group() +font = bitmap_font.load_font("/Helvetica-Bold-16.pcf") +blinka_bitmap = displayio.OnDiskBitmap("/cpday_tft.bmp") +blinka_grid = displayio.TileGrid(blinka_bitmap, pixel_shader=blinka_bitmap.pixel_shader) +scrolling_label = bitmap_label.Label(font, text=" ", y=display.height - 13) + +group.append(blinka_grid) +group.append(scrolling_label) +display.root_group = group +display.auto_refresh = False + +refresh_clock = ticks_ms() +refresh_timer = 3600 * 1000 +clock_clock = ticks_ms() +clock_timer = 1000 +scroll_clock = ticks_ms() +scroll_timer = 50 +first_run = True + +while True: + # only query the online time once per hour (and on first run) + if ticks_diff(ticks_ms(), refresh_clock) >= refresh_timer or first_run: + try: + print("Getting time from internet!") + now = ntp.datetime + print(now) + total_seconds = time.mktime(now) + first_run = False + refresh_clock = ticks_add(refresh_clock, refresh_timer) + except Exception as e: # pylint: disable=broad-except + print("Some error occured, retrying! -", e) + time.sleep(2) + microcontroller.reset() + + if ticks_diff(ticks_ms(), clock_clock) >= clock_timer: + remaining = time.mktime(event_time) - total_seconds + secs_remaining = remaining % 60 + remaining //= 60 + mins_remaining = remaining % 60 + remaining //= 60 + hours_remaining = remaining % 24 + remaining //= 24 + days_remaining = remaining + scrolling_label.text = (f"{days_remaining} DAYS, {hours_remaining} HOURS," + + f"{mins_remaining} MINUTES & {secs_remaining} SECONDS") + total_seconds += 1 + clock_clock = ticks_add(clock_clock, clock_timer) + if ticks_diff(ticks_ms(), scroll_clock) >= scroll_timer: + scrolling_label.x -= 1 + if scrolling_label.x < -(scrolling_label.width + 5): + scrolling_label.x = display.width + 2 + display.refresh() + scroll_clock = ticks_add(scroll_clock, scroll_timer) diff --git a/CircuitPython_Day_2024_Projects/Feather_TFT_NTP_Countdown/cpday_tft.bmp b/CircuitPython_Day_2024_Projects/Feather_TFT_NTP_Countdown/cpday_tft.bmp new file mode 100644 index 000000000..88e3cf2d9 Binary files /dev/null and b/CircuitPython_Day_2024_Projects/Feather_TFT_NTP_Countdown/cpday_tft.bmp differ diff --git a/CircuitPython_Day_2024_Projects/Feather_TFT_NTP_Countdown/cpday_tft_plain.bmp b/CircuitPython_Day_2024_Projects/Feather_TFT_NTP_Countdown/cpday_tft_plain.bmp new file mode 100644 index 000000000..f53d50603 Binary files /dev/null and b/CircuitPython_Day_2024_Projects/Feather_TFT_NTP_Countdown/cpday_tft_plain.bmp differ diff --git a/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/Helvetica-Bold-16.pcf b/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/Helvetica-Bold-16.pcf new file mode 100644 index 000000000..deb9092d1 Binary files /dev/null and b/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/Helvetica-Bold-16.pcf differ diff --git a/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/circuitpython_day_2024_820x260_16bit.bmp b/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/circuitpython_day_2024_820x260_16bit.bmp new file mode 100644 index 000000000..1c794dff2 Binary files /dev/null and b/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/circuitpython_day_2024_820x260_16bit.bmp differ diff --git a/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/code.py b/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/code.py new file mode 100644 index 000000000..9e369cba0 --- /dev/null +++ b/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/code.py @@ -0,0 +1,182 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# SPDX-FileCopyrightText: 2024 Tyeth Gundry for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import os +import time +import wifi +import board +import displayio +import supervisor +import adafruit_connection_manager +import adafruit_requests +from adafruit_io.adafruit_io import IO_HTTP +from adafruit_bitmap_font import bitmap_font +from adafruit_display_text import bitmap_label +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff + +## See TZ Identifier column at https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +## If you want to set the timezone, you can do so with the following code, which +## attempts to get timezone from settings.toml or defaults to New York +timezone = os.getenv("ADAFRUIT_AIO_TIMEZONE", "America/New_York") +## Or instead rely on automatic timezone detection based on IP Address +# timezone = None + + +## The time of the thing! +EVENT_YEAR = 2024 +EVENT_MONTH = 8 +EVENT_DAY = 16 +EVENT_HOUR = 0 +EVENT_MINUTE = 0 +## we'll make a python-friendly structure +event_time = time.struct_time( + ( + EVENT_YEAR, + EVENT_MONTH, + EVENT_DAY, + EVENT_HOUR, + EVENT_MINUTE, + 0, # we don't track seconds + -1, # we dont know day of week/year or DST + -1, + False, + ) +) + +print("Connecting to WiFi...") +wifi.radio.connect( + os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD") +) + +## Initialize a requests session using the newer connection manager +## See https://adafruit-playground.com/u/justmobilize/pages/adafruit-connection-manager +pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio) +ssl_context = adafruit_connection_manager.get_radio_ssl_context(wifi.radio) +requests = adafruit_requests.Session(pool, ssl_context) + +## Create an instance of the Adafruit IO HTTP client +io = IO_HTTP( + os.getenv("ADAFRUIT_AIO_USERNAME"), os.getenv("ADAFRUIT_AIO_KEY"), requests +) + +## Setup display and size appropriate assets +if board.board_id == "adafruit_qualia_s3_rgb666": + # Display Initialisation for 3.2" Bar display (320x820) + from qualia_bar_display_320x820 import setup_display + display = setup_display() + display.rotation = 90 # Rotate the display + BITMAP_FILE = "/circuitpython_day_2024_820x260_16bit.bmp" + FONT_FILE = "/font_free_mono_bold_48.pcf" + FONT_Y_OFFSET = 30 + blinka_bitmap = displayio.OnDiskBitmap(BITMAP_FILE) + PIXEL_SHADER = displayio.ColorConverter( + input_colorspace=displayio.Colorspace.RGB565 + ) +else: + # Setup built-in display + display = board.DISPLAY + BITMAP_FILE = "/cpday_tft.bmp" + FONT_FILE = "/Helvetica-Bold-16.pcf" + FONT_Y_OFFSET = 13 + PIXEL_SHADER = displayio.ColorConverter() + blinka_bitmap = displayio.OnDiskBitmap(BITMAP_FILE) + PIXEL_SHADER = blinka_bitmap.pixel_shader +group = displayio.Group() +font = bitmap_font.load_font(FONT_FILE) +blinka_grid = displayio.TileGrid(blinka_bitmap, pixel_shader=blinka_bitmap.pixel_shader) +scrolling_label = bitmap_label.Label(font, text=" ", y=display.height - FONT_Y_OFFSET) + +group.append(blinka_grid) +group.append(scrolling_label) +display.root_group = group +display.auto_refresh = False + +refresh_clock = ticks_ms() +refresh_timer = 3600 * 1000 # 1 hour +clock_clock = ticks_ms() +clock_timer = 1000 +scroll_clock = ticks_ms() +scroll_timer = 50 +first_run = True +finished = False +triggered = False + +while True: + # only query the online time once per hour (and on first run) + if ticks_diff(ticks_ms(), refresh_clock) >= refresh_timer or first_run: + try: + print("Getting time from internet!") + now = time.struct_time(io.receive_time(timezone)) + print(now) + total_seconds = time.mktime(now) + refresh_clock = ticks_add(refresh_clock, refresh_timer) + except Exception as e: # pylint: disable=broad-except + print("Some error occured, retrying via supervisor.reload in 5seconds! -", e) + time.sleep(5) + # Normally calling microcontroller.reset() would be the way to go, but due to + # a bug causing a reset into tinyUF2 bootloader mode we're instead going to + # disconnect wifi to ensure fresh connection + use supervisor.reload() + wifi.radio.enabled = False + supervisor.reload() + + if ticks_diff(ticks_ms(), clock_clock) >= clock_timer: + remaining = time.mktime(event_time) - total_seconds + if remaining < 0: + # calculate time since event + remaining = abs(remaining) + secs_remaining = -(remaining % 60) + remaining //= 60 + mins_remaining = -(remaining % 60) + remaining //= 60 + hours_remaining = -(remaining % 24) + remaining //= 24 + days_remaining = -remaining + finished = True + if not first_run and days_remaining == 0: + scrolling_label.text = ( + "It's CircuitPython Day 2024! The snakiest day of the year!" + ) + + # Check for the moment of the event to trigger something (a NASA snake launch) + if not triggered and ( + hours_remaining == 0 + and mins_remaining == 0 + and secs_remaining <= 1 + # Change at/after xx:yy:01 seconds so we've already updated the display + ): + # send a signal to an adafruit IO feed, where an Action is listening + print("Launch the snakes! (sending message to Adafruit IO)") + triggered = True + io.send_data("cpday-countdown", "Launch the snakes!") + + else: + # calculate time until event + secs_remaining = remaining % 60 + remaining //= 60 + mins_remaining = remaining % 60 + remaining //= 60 + hours_remaining = remaining % 24 + remaining //= 24 + days_remaining = remaining + if not finished or (finished and days_remaining < 0): + # Add 1 to negative days_remaining to count from end of day instead of start + if days_remaining < 0: + days_remaining += 1 + # Update the display with current countdown value + scrolling_label.text = ( + f"{days_remaining} DAYS, {hours_remaining} HOURS," + + f"{mins_remaining} MINUTES & {secs_remaining} SECONDS" + ) + + total_seconds += 1 + clock_clock = ticks_add(clock_clock, clock_timer) + if ticks_diff(ticks_ms(), scroll_clock) >= scroll_timer: + scrolling_label.x -= 1 + if scrolling_label.x < -(scrolling_label.width + 5): + scrolling_label.x = display.width + 2 + display.refresh() + scroll_clock = ticks_add(scroll_clock, scroll_timer) + + first_run = False diff --git a/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/cpday_tft.bmp b/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/cpday_tft.bmp new file mode 100644 index 000000000..88e3cf2d9 Binary files /dev/null and b/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/cpday_tft.bmp differ diff --git a/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/font_free_mono_bold_48.pcf b/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/font_free_mono_bold_48.pcf new file mode 100644 index 000000000..f08b28e29 Binary files /dev/null and b/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/font_free_mono_bold_48.pcf differ diff --git a/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/qualia_bar_display_320x820.py b/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/qualia_bar_display_320x820.py new file mode 100644 index 000000000..6706395a2 --- /dev/null +++ b/CircuitPython_Day_2024_Projects/Qualia_820x320_IO_Countdown/qualia_bar_display_320x820.py @@ -0,0 +1,101 @@ +# SPDX-FileCopyrightText: 2024 Tyeth Gundry for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +# pylint: disable=import-outside-toplevel, line-too-long +def setup_display(): + # Code taken from Adafruit Qualia ESP32-S3 for RGB-666 Displays Learn Guide - Rectangle Bar 3.2" display + # https://learn.adafruit.com/adafruit-qualia-esp32-s3-for-rgb666-displays/qualia-rgb666-with-tl032fwv01-3-2-320x820-bar-display + from displayio import release_displays + release_displays() + + import busio + import board + import dotclockframebuffer + from framebufferio import FramebufferDisplay + + init_sequence_tl032 = bytes(( + b'\x11\x80d' + b'\xff\x05w\x01\x00\x00\x13' + b'\xef\x01\x08' + b'\xff\x05w\x01\x00\x00\x10' + b'\xc0\x02\xe5\x02' + b'\xc1\x02\x0c\n' + b'\xc2\x02\x07\x0f' + b'\xc3\x01\x02' + b'\xcc\x01\x10' + b'\xcd\x01\x08' + b'\xb0\x10\x00\x08Q\r\xce\x06\x00\x08\x08\x1d\x02\xd0\x0fo6?' + b'\xb1\x10\x00\x10O\x0c\x11\x05\x00\x07\x07\x1f\x05\xd3\x11n4?' + b'\xff\x05w\x01\x00\x00\x11' + b'\xb0\x01M' + b'\xb1\x01\x1c' + b'\xb2\x01\x87' + b'\xb3\x01\x80' + b'\xb5\x01G' + b'\xb7\x01\x85' + b'\xb8\x01!' + b'\xb9\x01\x10' + b'\xc1\x01x' + b'\xc2\x01x' + b'\xd0\x81\x88d' + b'\xe0\x03\x80\x00\x02' + b'\xe1\x0b\x04\xa0\x00\x00\x05\xa0\x00\x00\x00``' + b'\xe2\r00``<\xa0\x00\x00=\xa0\x00\x00\x00' + b'\xe3\x04\x00\x0033' + b'\xe4\x02DD' + b'\xe5\x10\x06>\xa0\xa0\x08@\xa0\xa0\nB\xa0\xa0\x0cD\xa0\xa0' + b'\xe6\x04\x00\x0033' + b'\xe7\x02DD' + b'\xe8\x10\x07?\xa0\xa0\tA\xa0\xa0\x0bC\xa0\xa0\rE\xa0\xa0' + b'\xeb\x07\x00\x01NN\xeeD\x00' + b"\xed\x10\xff\xff\x04Vr\xff\xff\xff\xff\xff\xff'e@\xff\xff" + b'\xef\x06\x10\r\x04\x08?\x1f' + b'\xff\x05w\x01\x00\x00\x13' + b'\xe8\x02\x00\x0e' + b'\xff\x05w\x01\x00\x00\x00' + b'\x11\x80x' + b'\xff\x05w\x01\x00\x00\x13' + b'\xe8\x82\x00\x0c\n' + b'\xe8\x02\x00\x00' + b'\xff\x05w\x01\x00\x00\x00' + b'6\x01\x00' + b':\x01f' + b'\x11\x80x' + b')\x80x' + )) + + board.I2C().deinit() + i2c = busio.I2C(board.SCL, board.SDA, frequency=400_000) + tft_io_expander = dict(board.TFT_IO_EXPANDER) + #tft_io_expander['i2c_address'] = 0x38 # uncomment for rev B + dotclockframebuffer.ioexpander_send_init_sequence(i2c, init_sequence_tl032, **tft_io_expander) + i2c.deinit() + + tft_pins = dict(board.TFT_PINS) + + tft_timings = { + "frequency": 16000000, + "width": 320, + "height": 820, + + "hsync_pulse_width": 3, + "hsync_back_porch": 251, + "hsync_front_porch": 150, + "hsync_idle_low": False, + + "vsync_pulse_width": 6, + "vsync_back_porch": 90, + "vsync_front_porch": 100, + "vsync_idle_low": False, + + "pclk_active_high": False, + "pclk_idle_high": False, + "de_idle_high": False, + } + + #bitmap = displayio.OnDiskBitmap("/display-ruler-720p.bmp") + + fb = dotclockframebuffer.DotClockFramebuffer(**tft_pins, **tft_timings) + display = FramebufferDisplay(fb, auto_refresh=False) + return display diff --git a/CircuitPython_Display_Text/colormask_example/code.py b/CircuitPython_Display_Text/colormask_example/code.py index f5f9ca1ab..cc5bc5810 100644 --- a/CircuitPython_Display_Text/colormask_example/code.py +++ b/CircuitPython_Display_Text/colormask_example/code.py @@ -21,7 +21,7 @@ bg_palette[0] = 0xDDDD00 # Make the display context main_group = displayio.Group() -display.show(main_group) +display.root_group = main_group font = bitmap_font.load_font("fonts/LeagueSpartan-Bold-16.bdf") reg_label = label.Label( diff --git a/CircuitPython_Display_Text/scale_example/code.py b/CircuitPython_Display_Text/scale_example/code.py index 064197aeb..e5f1c41b9 100644 --- a/CircuitPython_Display_Text/scale_example/code.py +++ b/CircuitPython_Display_Text/scale_example/code.py @@ -15,7 +15,7 @@ display = board.DISPLAY # Make the display context main_group = displayio.Group() -display.show(main_group) +display.root_group = main_group font = terminalio.FONT diff --git a/CircuitPython_Feather_DVI_Xerox_820/code.py b/CircuitPython_Feather_DVI_Xerox_820/code.py new file mode 100644 index 000000000..fe02c62a9 --- /dev/null +++ b/CircuitPython_Feather_DVI_Xerox_820/code.py @@ -0,0 +1,139 @@ +# SPDX-FileCopyrightText: 2024 Jeff Epler for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import array + +import ulab +import rp2pio +import board +import adafruit_pioasm +import picodvi +import displayio + +# The connections from the Xerox 820 +vdata = board.D9 # Followed by hsync on D10 & vsync on D11 +# The nominal frequency of the Xerox 820 video circuitry. Can modify by steps +# of approximately ±42000 to improve display stability +pixel_frequency = 10_694_250 +# The PIO peripheral is run at a multiple of the pixel frequency. This must be less +# than the CPU speed, normally 120MHz. +clocks_per_pixel = 10 +# The "fine pixel offset", shifts the sample time by this many sub-pixels +fine_pixel = 0 +# A pin that shows when the Pico samples the pixel value. With an oscilloscope, this can +# be used to help fine tune the pixel_frequency & fine_pixel numbers. Ideally, the rising +# edge of pixel_sync_out is exactly in the middle of time a pixel is high/low. +pixel_sync_out = board.D5 + +# Details of the Xerox display timing. You may need to modify `blanking_lines` and +# `blanking_pixels` to adjust the vertical and horizontal position of the screen content. +# Normally you wouldn't change `active_lines` or `active_pixels`. +active_lines = 240 +blanking_lines = 18 +active_pixels = 640 +blanking_pixels = 58 +total_lines = active_lines + blanking_lines + +# Pins for the DVI connector +dvi_pins = dict( + clk_dp=board.CKP, + clk_dn=board.CKN, + red_dp=board.D0P, + red_dn=board.D0N, + green_dp=board.D1P, + green_dn=board.D1N, + blue_dp=board.D2P, + blue_dn=board.D2N, +) + +# Set up the display. Try 640x240 first (this mode is likely to be added in CircuitPython +# 9.1.x) then 640x480, which works in CircuitPython 9.0.x. +try: + displayio.release_displays() + dvi = picodvi.Framebuffer(640, 240, **dvi_pins, color_depth=1) +except ValueError: + print( + "Note: This version of CircuitPython does not support 640x240\n." + "Display will be compressed vertically." + ) + displayio.release_displays() + dvi = picodvi.Framebuffer(640, 480, **dvi_pins, color_depth=1) + +# Clear the display +ulab.numpy.frombuffer(dvi, dtype=ulab.numpy.uint8)[:] = 0 + +# Create the "control stream". The details are discussed in the Learn article +def control_gen(): + yield total_lines - 2 + for _ in range(blanking_lines): + yield from (1, 0) # 0 active pixels is special-cased + for _ in range(active_lines): + yield from (blanking_pixels - 1, active_pixels - 1) + +control = array.array("L", control_gen()) + +# These little programs are run on the RP2040's PIO co-processor, and handle the pixel +# data and sync pulses. +jmp_0 = adafruit_pioasm.Program("jmp 0") + +program = adafruit_pioasm.Program( + f""" +.side_set 1 + + .wrap_target + out y, 32 ; get total line count + wait 0, pin 2 + wait 1, pin 2 ; wait for vsync + +wait_line_inactive: + out x, 32 ; get total line count + wait 0, pin 1 + wait 1, pin 1; wait for hsync + +wait_line_active: + nop [{clocks_per_pixel-2}] + jmp x--, wait_line_active ; count off non-active pixels + + out x, 32 [{fine_pixel}] ; get line active pixels & perform fine pixel adjust + jmp !x, wait_line_inactive ; no pixels this line, wait next hsync + +capture_active_pixels: + in pins, 1 side 1 + jmp x--, capture_active_pixels [{clocks_per_pixel-2}] ; more pixels + jmp y--, wait_line_inactive ; more lines? + .wrap +""" +) + +# Set up PIO to transfer pixels from Xerox +pio = rp2pio.StateMachine( + program.assembled, + frequency=pixel_frequency * clocks_per_pixel, + first_in_pin=vdata, + in_pin_count=3, + in_pin_pull_up=True, + first_sideset_pin=pixel_sync_out, + auto_pull=True, + pull_threshold=32, + auto_push=True, + push_threshold=32, + offset=0, + **program.pio_kwargs, +) + +# Set up the DVI framebuffer memory as a capture target +words_per_row = 640 // 32 +first_row = (dvi.height - 240) // 2 # adjust text to center if in 640x480 mode +buf = memoryview(dvi).cast("L")[ + first_row * words_per_row : (first_row + active_lines) * words_per_row +] +assert len(buf) == 4800 # Check that the right amount will be transferred + +b = array.array("L", [0]) + +# Repeatedly transfer pixels from Xerox into DVI framebuffer. +while True: + pio.run(jmp_0.assembled) + pio.clear_rxfifo() + pio.write_readinto(control, buf) diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch01.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch01.json new file mode 100644 index 000000000..ca435b4ed --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch01.json @@ -0,0 +1,38 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 7, 7, 7, 7, 7, 7, 7], + [6, 6, 5, 7, 7, 7, 7, 7, 7, 7], + [5, 4, 5, 7, 7, 7, 7, 7, 7, 7] + ]}, + "goal": { + "karel": { + "x": 0, + "y": 2, + "direction": "west" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [4, 5, 5, 7, 7, 7, 7, 7, 7, 7], + [6, 6, 5, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 7, 7, 7, 7, 7, 7, 7] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch02.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch02.json new file mode 100644 index 000000000..432acd714 --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch02.json @@ -0,0 +1,38 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 7, 7, 7, 7], + [5, 4, 5, 6, 6, 6, 7, 7, 7, 7] + ]}, + "goal": { + "karel": { + "x": 5, + "y": 1, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 7, 7, 7, 7], + [5, 5, 5, 5, 4, 5, 7, 7, 7, 7], + [5, 5, 5, 6, 6, 6, 7, 7, 7, 7] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch03a.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch03a.json new file mode 100644 index 000000000..432acd714 --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch03a.json @@ -0,0 +1,38 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 7, 7, 7, 7], + [5, 4, 5, 6, 6, 6, 7, 7, 7, 7] + ]}, + "goal": { + "karel": { + "x": 5, + "y": 1, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 7, 7, 7, 7], + [5, 5, 5, 5, 4, 5, 7, 7, 7, 7], + [5, 5, 5, 6, 6, 6, 7, 7, 7, 7] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch03b.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch03b.json new file mode 100644 index 000000000..e907d61c3 --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch03b.json @@ -0,0 +1,38 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 9, + "direction": "east" + }, + "world": [ + [5, 5, 5, 5, 6, 6, 5, 5, 5, 5], + [5, 5, 5, 5, 6, 6, 5, 5, 4, 5], + [5, 5, 5, 5, 6, 6, 5, 5, 5, 5], + [5, 5, 5, 5, 6, 6, 5, 5, 5, 5], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 5] + ]}, + "goal": { + "karel": { + "x": 1, + "y": 1, + "direction": "west" + }, + "world": [ + [5, 5, 5, 5, 6, 6, 5, 5, 5, 5], + [5, 5, 5, 5, 6, 6, 5, 5, 5, 5], + [5, 5, 5, 5, 6, 6, 5, 5, 5, 5], + [5, 5, 5, 5, 6, 6, 5, 5, 5, 5], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 5], + [5, 4, 5, 5, 5, 5, 5, 5, 5, 5], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 5] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch04.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch04.json new file mode 100644 index 000000000..a4e369d9d --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch04.json @@ -0,0 +1,38 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 1, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7], + [6, 5, 6, 6, 6, 7, 7, 7, 7, 7] + ]}, + "goal": { + "karel": { + "x": 2, + "y": 1, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7], + [6, 4, 6, 6, 6, 7, 7, 7, 7, 7] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch05a.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch05a.json new file mode 100644 index 000000000..f92b163ac --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch05a.json @@ -0,0 +1,41 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7] + ]}, + "goal": { + "karel": { + "x": 2, + "y": 0, + "direction": "east" + }, + "beeper_counts": { + "1, 0": 42 + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 4, 5, 5, 7, 7, 7, 7, 7, 7] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch05b.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch05b.json new file mode 100644 index 000000000..aa8b02d2f --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch05b.json @@ -0,0 +1,39 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7] + ]}, + "goal": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [4, 5, 5, 4, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [4, 5, 5, 4, 7, 7, 7, 7, 7, 7] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch05c.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch05c.json new file mode 100644 index 000000000..deca9dbd3 --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch05c.json @@ -0,0 +1,44 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7] + ]}, + "goal": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "beeper_counts": { + "0, 0": 5, + "3, 0": 5, + "0, 3": 5, + "3, 3": 5 + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [4, 5, 5, 4, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 7, 7, 7, 7, 7, 7], + [4, 5, 5, 4, 7, 7, 7, 7, 7, 7] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch06a.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch06a.json new file mode 100644 index 000000000..877b03831 --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch06a.json @@ -0,0 +1,38 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7] + ]}, + "goal": { + "karel": { + "x": 6, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch06b.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch06b.json new file mode 100644 index 000000000..93f73d7e3 --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch06b.json @@ -0,0 +1,38 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7] + ]}, + "goal": { + "karel": { + "x": 6, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 7, 7, 7], + [4, 4, 4, 4, 4, 4, 4, 7, 7, 7] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch07.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch07.json new file mode 100644 index 000000000..3246aab90 --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch07.json @@ -0,0 +1,38 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 4, 5, 4, 4, 5, 4, 5, 7, 7] + ]}, + "goal": { + "karel": { + "x": 7, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 7, 7], + [4, 5, 4, 5, 5, 4, 5, 4, 7, 7] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch08.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch08.json new file mode 100644 index 000000000..66f2ccd5f --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch08.json @@ -0,0 +1,41 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 7], + [5, 5, 5, 5, 5, 4, 5, 5, 5, 7], + [5, 5, 4, 5, 5, 4, 5, 5, 5, 7], + [4, 5, 4, 5, 5, 4, 5, 5, 5, 7], + [4, 4, 4, 5, 4, 4, 5, 5, 5, 7], + [4, 4, 4, 4, 4, 4, 5, 4, 5, 7], + [4, 4, 4, 4, 4, 4, 5, 4, 5, 7] + ]}, + "goal": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "beeper_counts": { + "8, 0": 25 + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 5, 7], + [5, 5, 5, 5, 5, 5, 5, 5, 4, 7] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/chapters/karel_ch_template.json b/CircuitPython_Karel_The_Robot/chapters/karel_ch_template.json new file mode 100644 index 000000000..943f6c10b --- /dev/null +++ b/CircuitPython_Karel_The_Robot/chapters/karel_ch_template.json @@ -0,0 +1,38 @@ +{ + "input": { + "karel": { + "x": 0, + "y": 0, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7] + ]}, + "goal": { + "karel": { + "x": 0, + "y": 2, + "direction": "east" + }, + "world": [ + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [7, 7, 7, 7, 7, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7], + [5, 5, 5, 5, 5, 7, 7, 7, 7, 7] + ]} +} \ No newline at end of file diff --git a/CircuitPython_Karel_The_Robot/code.py b/CircuitPython_Karel_The_Robot/code.py new file mode 100644 index 000000000..a28f11d6a --- /dev/null +++ b/CircuitPython_Karel_The_Robot/code.py @@ -0,0 +1,36 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT +""" +Karel the Robot code.py for devices with built-in display available +at board.DISPLAY. +""" +# pylint: disable=wildcard-import, unused-wildcard-import +from karel.circuitpythonkarel import * + + +# load a chapter. Edit the chapter filename to change chapters +# see available chapter files in chapters/ directory. +chapter_data = load_state_file("chapters/karel_ch01.json") + + +def main(): + """ + Karel main() function declaration. + Put your code for Karel into this function. + """ + ## START OF MAIN FUNCTION, YOUR CODE GOES BELOW HERE ## + + + + ## END OF MAIN FUNCTION, YOUR CODE GOES ABOVE HERE ## + print(f"Goal state reached? {world.check_goal_state(chapter_data)}") + + +# call the main() function +main() + +# Run forever so that the ending state of Karel and the world +# remains visible on the display. +while True: + pass diff --git a/CircuitPython_Karel_The_Robot/karel/__init__.py b/CircuitPython_Karel_The_Robot/karel/__init__.py new file mode 100644 index 000000000..ed2a9d7a3 --- /dev/null +++ b/CircuitPython_Karel_The_Robot/karel/__init__.py @@ -0,0 +1,3 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT diff --git a/CircuitPython_Karel_The_Robot/karel/circuitpythonkarel.py b/CircuitPython_Karel_The_Robot/karel/circuitpythonkarel.py new file mode 100644 index 000000000..31d12c6e4 --- /dev/null +++ b/CircuitPython_Karel_The_Robot/karel/circuitpythonkarel.py @@ -0,0 +1,453 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT +""" +Karel the Robot helper class +""" + +import json +import time + +import terminalio +from adafruit_display_text.bitmap_label import Label +import adafruit_imageload +import board +from displayio import Group, Bitmap, Palette, TileGrid + +EAST = 0 +NORTH = 1 +WEST = 2 +SOUTH = 3 + +DIRECTION_WORDS = ["east", "north", "west", "south"] + +DELAY = 0.2 + +TILE_SIZE = 24 + +COLOR_NAMES = [ + "white", + "black", + "red", + "orange", + "yellow", + "green", + "blue", + "purple", + "pink", + "light_gray", + "gray", + "brown", + "dark_green", + "turquoise", + "dark_blue", + "dark_red", +] +COLOR_VALUES = [ + 0xFFFFFF, + 0x000000, + 0xFF0000, + 0xFFA500, + 0xFFEE00, + 0x00C000, + 0x0000FF, + 0x8040C0, + 0xFF40C0, + 0xAAAAAA, + 0x444444, + 0xCA801D, + 0x008700, + 0x00C0C0, + 0x0000AA, + 0x800000, +] + + +class FrontIsBlocked(Exception): + pass + + +class BeeperNotPresent(Exception): + pass + + +class NoBeepersInBag(Exception): + pass + + +class Karel: + def __init__(self, spritesheet_bmp, spritesheet_palette): + + self.tilegrid = TileGrid( + spritesheet_bmp, + pixel_shader=spritesheet_palette, + default_tile=0, + tile_width=TILE_SIZE, + tile_height=TILE_SIZE, + ) + self._direction = EAST + self.beeper_count = 0 + + @property + def direction(self): + return self._direction + + @direction.setter + def direction(self, new_value): + self._direction = new_value + if new_value == NORTH: + self.tilegrid[0, 0] = 1 + if new_value == EAST: + self.tilegrid[0, 0] = 0 + if new_value == SOUTH: + self.tilegrid[0, 0] = 3 + if new_value == WEST: + self.tilegrid[0, 0] = 2 + + @property + def x(self): + return self.tilegrid.x // TILE_SIZE + + @x.setter + def x(self, new_value): + self.tilegrid.x = new_value * TILE_SIZE + + @property + def y(self): + return self.tilegrid.y // TILE_SIZE + + @y.setter + def y(self, new_value): + self.tilegrid.y = new_value * TILE_SIZE + + +class World: + def __init__(self, display, world_width=10, world_height=10, beeper_limit=False): + self.world_width = world_width + self.world_height = world_height + color_count = len(COLOR_NAMES) + self.background_bmp = Bitmap(world_width, world_height, color_count) + self.background_palette = Palette(color_count) + for i, color_val in enumerate(COLOR_VALUES): + self.background_palette[i] = color_val + self.background_tilegrid = TileGrid( + bitmap=self.background_bmp, pixel_shader=self.background_palette + ) + self.background_group = Group(scale=TILE_SIZE) + self.background_group.append(self.background_tilegrid) + self.display = display + + self.world_group = Group() + self.world_group.append(self.background_group) + + lib_dir = "karel" + self.spritesheet_bmp, self.spritesheet_palette = adafruit_imageload.load( + f"{lib_dir}/spritesheet.png" + ) + self.spritesheet_palette.make_transparent(0) + + self.world_tilegrid = TileGrid( + self.spritesheet_bmp, + pixel_shader=self.spritesheet_palette, + tile_width=TILE_SIZE, + tile_height=TILE_SIZE, + width=20, + height=15, + default_tile=7, + ) + + self.beeper_limit = beeper_limit + + self.beeper_count_labels = None + self._init_beeper_counts() + self.world_group.append(self.world_tilegrid) + + self.karel = Karel(self.spritesheet_bmp, self.spritesheet_palette) + self.world_group.append(self.karel.tilegrid) + + display.root_group = self.world_group + time.sleep(DELAY) + + def _init_beeper_counts(self): + if self.beeper_count_labels is not None: + for lbl in self.beeper_count_labels: + self.world_group.remove(lbl) + + self.beeper_count_labels = {} + self.beeper_counts = [] + for _ in range(self.world_height): + self.beeper_counts.append([0 for x in range(self.world_width)]) + + def load_state(self, state_obj): + self._init_beeper_counts() + if "beeper_counts" in state_obj["input"]: + for beeper_count_loc_str in state_obj["input"]["beeper_counts"].keys(): + beeper_count_loc = [int(_) for _ in beeper_count_loc_str.split(",")] + self.beeper_counts[world.world_height - 1 - beeper_count_loc[1]][ + beeper_count_loc[0] + ] = state_obj["input"]["beeper_counts"][beeper_count_loc_str] + update_beeper_count_labels() + + self.karel.x = state_obj["input"]["karel"]["x"] + self.karel.y = self.world_height - 1 - state_obj["input"]["karel"]["y"] + self.karel.direction = DIRECTION_WORDS.index( + state_obj["input"]["karel"]["direction"] + ) + + for y, row in enumerate(state_obj["input"]["world"]): + for x, cell in enumerate(row): + self.world_tilegrid[x, y] = cell + + def check_goal_state(self, state_obj): + + if (self.world_height - 1 - self.karel.y) != state_obj["goal"]["karel"]["y"]: + print("karel y incorrect") + return False + if self.karel.x != state_obj["goal"]["karel"]["x"]: + print("karel x incorrect") + return False + if self.karel.direction != DIRECTION_WORDS.index( + state_obj["goal"]["karel"]["direction"] + ): + print("karel dir incorrect") + return False + + if "beeper_counts" in state_obj["goal"]: + for beeper_count_loc_str in state_obj["goal"]["beeper_counts"].keys(): + beeper_count_loc = [int(_) for _ in beeper_count_loc_str.split(",")] + if ( + self.beeper_counts[world.world_height - 1 - beeper_count_loc[1]][ + beeper_count_loc[0] + ] + != state_obj["goal"]["beeper_counts"][beeper_count_loc_str] + ): + print(f"beeper count incorrect {beeper_count_loc}") + return False + + for y in range(self.world_height): + for x in range(self.world_width): + + goal_cell_index = state_obj["goal"]["world"][y][x] + if self.world_tilegrid[x, y] != goal_cell_index: + print( + f"world mismatch: {(x, world.world_height - 1 - y)}: " + + f"{self.world_tilegrid[x, y]} != {goal_cell_index}" + ) + return False + return True + + +world = World(board.DISPLAY) + + +def move(): + if front_is_blocked(): + raise FrontIsBlocked("Karel can't move there") + + if world.karel.direction == EAST: + world.karel.x += 1 + if world.karel.direction == WEST: + world.karel.x -= 1 + + if world.karel.direction == NORTH: + world.karel.y -= 1 + if world.karel.direction == SOUTH: + world.karel.y += 1 + + time.sleep(DELAY) + + +def turn_left(): + if world.karel.direction == EAST: + world.karel.direction = NORTH + elif world.karel.direction == NORTH: + world.karel.direction = WEST + elif world.karel.direction == WEST: + world.karel.direction = SOUTH + elif world.karel.direction == SOUTH: + world.karel.direction = EAST + time.sleep(DELAY) + + +def corner_is_blocked(corner_x, corner_y): + corner_loc = [corner_x, corner_y] + if corner_loc[0] < 0 or corner_loc[1] < 0: + return True + + if corner_loc[0] >= world.world_width or corner_loc[1] >= world.world_height: + return True + tile_index = world.world_tilegrid[corner_loc[0], corner_loc[1]] + if tile_index in (6, 7): + return True + + return False + + +def front_is_blocked(): + front_loc = [world.karel.x, world.karel.y] + if world.karel.direction == EAST: + front_loc[0] += 1 + if world.karel.direction == WEST: + front_loc[0] -= 1 + if world.karel.direction == NORTH: + front_loc[1] -= 1 + if world.karel.direction == SOUTH: + front_loc[1] += 1 + return corner_is_blocked(front_loc[0], front_loc[1]) + + +def right_is_blocked(): + right_loc = [world.karel.x, world.karel.y] + if world.karel.direction == EAST: + right_loc[1] += 1 + if world.karel.direction == WEST: + right_loc[1] -= 1 + if world.karel.direction == NORTH: + right_loc[0] += 1 + if world.karel.direction == SOUTH: + right_loc[0] -= 1 + return corner_is_blocked(right_loc[0], right_loc[1]) + + +def left_is_blocked(): + left_loc = [world.karel.x, world.karel.y] + if world.karel.direction == EAST: + left_loc[1] -= 1 + if world.karel.direction == WEST: + left_loc[1] += 1 + if world.karel.direction == NORTH: + left_loc[0] -= 1 + if world.karel.direction == SOUTH: + left_loc[0] += 1 + return corner_is_blocked(left_loc[0], left_loc[1]) + + +def paint_corner(color): + if color not in COLOR_NAMES: + raise ValueError( + f"Color {color} is not valid. Supported colors are {COLOR_NAMES}" + ) + world.background_bmp[world.karel.x, world.karel.y] = COLOR_NAMES.index(color) + + +def update_beeper_count_labels(): + for y, row in enumerate(world.beeper_counts): + for x, count in enumerate(row): + if count <= 1: + if (x, y) in world.beeper_count_labels: + world.world_group.remove(world.beeper_count_labels[(x, y)]) + world.beeper_count_labels.pop((x, y)) + + else: + if (x, y) in world.beeper_count_labels: + world.beeper_count_labels[(x, y)].text = str(count) + else: + world.beeper_count_labels[(x, y)] = Label( + terminalio.FONT, + text=str(count), + color=0x000000, + anchor_point=(0.5, 0.5), + anchored_position=( + x * TILE_SIZE + TILE_SIZE // 2, + y * TILE_SIZE + TILE_SIZE // 2, + ), + ) + world.world_group.append(world.beeper_count_labels[(x, y)]) + + +def pick_beeper(): + if not beepers_present(): + raise BeeperNotPresent("There is no beeper here") + + world.karel.beeper_count += 1 + + world.beeper_counts[world.karel.y][world.karel.x] = max( + 0, world.beeper_counts[world.karel.y][world.karel.x] - 1 + ) + update_beeper_count_labels() + if world.beeper_counts[world.karel.y][world.karel.x] == 0: + world.world_tilegrid[world.karel.x, world.karel.y] = 5 + time.sleep(DELAY) + + +def beepers_in_bag(): + return world.karel.beeper_count + + +def put_beeper(): + if beepers_in_bag() == 0 and world.beeper_limit: + raise NoBeepersInBag("There are no beepers in Karel's bag") + + world.karel.beeper_count -= 1 + world.beeper_counts[world.karel.y][world.karel.x] += 1 + update_beeper_count_labels() + world.world_tilegrid[world.karel.x, world.karel.y] = 4 + time.sleep(DELAY) + + +def beepers_present(): + tile_index = world.world_tilegrid[world.karel.x, world.karel.y] + if tile_index == 4: + return True + return False + + +def no_beepers_in_bag(): + return world.karel.beeper_count == 0 + + +def no_beepers_present(): + return not beepers_present() + + +def facing_north(): + return world.karel.direction == NORTH + + +def facing_east(): + return world.karel.direction == EAST + + +def facing_west(): + return world.karel.direction == WEST + + +def facing_south(): + return world.karel.direction == SOUTH + + +def not_facing_north(): + return not facing_north() + + +def not_facing_east(): + return not facing_east() + + +def not_facing_west(): + return not facing_west() + + +def not_facing_south(): + return not facing_south() + + +def left_is_clear(): + return not left_is_blocked() + + +def right_is_clear(): + return not right_is_blocked() + + +def front_is_clear(): + return not front_is_blocked() + + +def load_state_file(state_filepath): + with open(state_filepath, "r") as f: + ch_obj = json.load(f) + world.load_state(ch_obj) + + time.sleep(DELAY) + return ch_obj diff --git a/CircuitPython_Karel_The_Robot/karel/spritesheet.png b/CircuitPython_Karel_The_Robot/karel/spritesheet.png new file mode 100644 index 000000000..f8bac2068 Binary files /dev/null and b/CircuitPython_Karel_The_Robot/karel/spritesheet.png differ diff --git a/CircuitPython_MP3StreamPlayer/code.py b/CircuitPython_MP3StreamPlayer/code.py new file mode 100644 index 000000000..e20fd7b8d --- /dev/null +++ b/CircuitPython_MP3StreamPlayer/code.py @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: 2024 Jeff Epler for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +# Stream MP3 audio to I2S decoder +# +# Tested with: +# +# * Adafruit Metro ESP32-S3 +# * Adafruit Metro ESP32-S2 +# * Adafruit Feather ESP32 V2 + +import time + +import adafruit_connection_manager +import adafruit_requests +import audiobusio +import audiomp3 +import board +import wifi + +mp3_buffer = bytearray(16384) +mp3_decoder = audiomp3.MP3Decoder("/silence.mp3", mp3_buffer) + +pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio) +ssl_context = adafruit_connection_manager.get_radio_ssl_context(wifi.radio) +requests = adafruit_requests.Session(pool, ssl_context) + +STREAMING_URL = "https://ice2.somafm.com/dronezone-128-mp3" + +if "D27" in dir(board): + # Feather ESP32 V2 has D27 instead of D11 + i2s = audiobusio.I2SOut(bit_clock=board.D12, word_select=board.D13, data=board.D27) +else: + i2s = audiobusio.I2SOut(bit_clock=board.D12, word_select=board.D13, data=board.D11) + +with requests.get(STREAMING_URL, headers={"connection": "close"}, stream=True) as response: + mp3_decoder.file = response.socket + i2s.play(mp3_decoder) + while i2s.playing: + time.sleep(0.1) diff --git a/CircuitPython_MP3StreamPlayer/silence.mp3 b/CircuitPython_MP3StreamPlayer/silence.mp3 new file mode 100644 index 000000000..992c284f3 Binary files /dev/null and b/CircuitPython_MP3StreamPlayer/silence.mp3 differ diff --git a/CircuitPython_PyPaint/code.py b/CircuitPython_PyPaint/code.py index a04c3089e..b0bbf3620 100644 --- a/CircuitPython_PyPaint/code.py +++ b/CircuitPython_PyPaint/code.py @@ -211,7 +211,7 @@ class Paint(object): self._palette = self._make_palette() self._splash.append(self._palette) - self._display.show(self._splash) + self._display.root_group = self._splash try: gc.collect() self._display.refresh(target_frames_per_second=60) diff --git a/CircuitPython_Pyloton/pyloton.py b/CircuitPython_Pyloton/pyloton.py index 61ea450ce..a7daf708f 100644 --- a/CircuitPython_Pyloton/pyloton.py +++ b/CircuitPython_Pyloton/pyloton.py @@ -171,28 +171,15 @@ class Pyloton: blinka_bitmap = "blinka-pyloton.bmp" - # Compatible with CircuitPython 6 & 7 - with open(blinka_bitmap, 'rb') as bitmap_file: - bitmap1 = displayio.OnDiskBitmap(bitmap_file) - tile_grid = displayio.TileGrid(bitmap1, pixel_shader=getattr(bitmap1, 'pixel_shader', displayio.ColorConverter())) - self.loading_group.append(tile_grid) - self.display.show(self.loading_group) - status_heading = label.Label(font=self.arial16, x=80, y=175, - text="Status", color=self.YELLOW) - rect = Rect(0, 165, 240, 75, fill=self.PURPLE) - self.loading_group.append(rect) - self.loading_group.append(status_heading) - - # # Compatible with CircuitPython 7+ - # bitmap1 = displayio.OnDiskBitmap(blinka_bitmap) - # tile_grid = displayio.TileGrid(bitmap1, pixel_shader=bitmap1.pixel_shader) - # self.loading_group.append(tile_grid) - # self.display.show(self.loading_group) - # status_heading = label.Label(font=self.arial16, x=80, y=175, - # text="Status", color=self.YELLOW) - # rect = Rect(0, 165, 240, 75, fill=self.PURPLE) - # self.loading_group.append(rect) - # self.loading_group.append(status_heading) + bitmap1 = displayio.OnDiskBitmap(blinka_bitmap) + tile_grid = displayio.TileGrid(bitmap1, pixel_shader=bitmap1.pixel_shader) + self.loading_group.append(tile_grid) + self.display.root_group = self.loading_group + status_heading = label.Label(font=self.arial16, x=80, y=175, + text="Status", color=self.YELLOW) + rect = Rect(0, 165, 240, 75, fill=self.PURPLE) + self.loading_group.append(rect) + self.loading_group.append(status_heading) def _load_fonts(self): """ @@ -495,7 +482,7 @@ class Pyloton: self.splash.append(sprites) - self.display.show(self.splash) + self.display.root_group = self.splash while self.loading_group: self.loading_group.pop() diff --git a/CircuitPython_Pyloton/requirements.txt b/CircuitPython_Pyloton/requirements.txt index 0bafcac85..7b602bca4 100644 --- a/CircuitPython_Pyloton/requirements.txt +++ b/CircuitPython_Pyloton/requirements.txt @@ -1,9 +1,9 @@ -adafruit_bitmap_font -adafruit_ble -adafruit_ble_apple_media -adafruit_ble_cycling_speed_and_cadence -adafruit_ble_heart_rate -adafruit_button -adafruit_display_shapes -adafruit_display_text -adafruit_imageload +adafruit-circuitpython-bitmap-font +adafruit-circuitpython-ble +adafruit-circuitpython-ble-apple-media +adafruit-circuitpython-ble-cycling-speed-and-cadence +adafruit-circuitpython-ble-heart-rate +adafruit-circuitpython-display-button +adafruit-circuitpython-display-shapes +adafruit-circuitpython-display-text +adafruit-circuitpython-imageload diff --git a/CircuitPython_Slider/backingupBMP.bmp b/CircuitPython_Slider/backingup_bmp.bmp similarity index 100% rename from CircuitPython_Slider/backingupBMP.bmp rename to CircuitPython_Slider/backingup_bmp.bmp diff --git a/CircuitPython_Slider/reverseQBMP.bmp b/CircuitPython_Slider/reverseQ_bmp.bmp similarity index 100% rename from CircuitPython_Slider/reverseQBMP.bmp rename to CircuitPython_Slider/reverseQ_bmp.bmp diff --git a/CircuitPython_Sound_Box_2/code.py b/CircuitPython_Sound_Box_2/code.py new file mode 100755 index 000000000..a6698a0d6 --- /dev/null +++ b/CircuitPython_Sound_Box_2/code.py @@ -0,0 +1,102 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import os +import random +import board +from digitalio import DigitalInOut, Direction +import neopixel +import audiocore +import audiobusio +import keypad +import adafruit_lis3dh + +from rainbowio import colorwheel + +# enable external power pin +# provides power to the external components +external_power = DigitalInOut(board.EXTERNAL_POWER) +external_power.direction = Direction.OUTPUT +external_power.value = True + +# external neopixels +num_pixels = 24 +pixels = neopixel.NeoPixel(board.EXTERNAL_NEOPIXELS, num_pixels, brightness=0.4, auto_write=True) + +delta_hue = 256//num_pixels +speed = 10 # higher numbers = faster rainbow spinning +i=0 + +# external button +switch = keypad.Keys((board.EXTERNAL_BUTTON,), value_when_pressed=False, pull=True) + +colors = [ + {'label': "BLUE", 'color': 0x0000FF}, + {'label': "RED", 'color': 0xFF0000}, + {'label': "GREEN", 'color': 0x00FF00}, + {'label': "YELLOW", 'color': 0xFFFF00}, + {'label': "AQUA", 'color': 0x00FFFF}, + {'label': "PURPLE", 'color': 0xFF00FF}, + {'label': "PINK", 'color': 0xFF0055}, + {'label': "ORANGE", 'color': 0xFF5500}, + {'label': "WHITE", 'color': 0x555555}, + ] + +shake_wavs = [] +color_wavs = [] +for filename in os.listdir('/wavs'): + if filename.lower().endswith('.wav') and not filename.startswith('.'): + if "SHAKE" in filename: + shake_wavs.append("/wavs/" + filename) + else: + for color in colors: + if color['label'] in filename: + color_wavs.append("/wavs/" + filename) + break + +audio = audiobusio.I2SOut(board.I2S_BIT_CLOCK, board.I2S_WORD_SELECT, board.I2S_DATA) + +num_colors = len(color_wavs) +num_shakes = len(shake_wavs) +wav_index = 0 + +def open_audio(num, wavs): + n = wavs[num] + f = open(n, "rb") + w = audiocore.WaveFile(f) + # wn = wav_names[num] + return w, n +wave, wave_name = open_audio(wav_index, color_wavs) + +i2c = board.I2C() +int1 = DigitalInOut(board.ACCELEROMETER_INTERRUPT) +lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, int1=int1) +lis3dh.range = adafruit_lis3dh.RANGE_2_G + +while True: + event = switch.events.get() + if event: + if event.pressed: + wave, wave_name = open_audio(random.randint(0, num_colors - 1), color_wavs) + audio.play(wave) + for color in colors: + if color['label'] in wave_name: + pixels.fill(color['color']) + else: + pass + time.sleep(1) + pixels.fill((0, 0, 0)) + print('pressed') + if event.released: + pass + if lis3dh.shake(shake_threshold=12): + wave, wave_name = open_audio(random.randint(0, num_shakes - 1), shake_wavs) + audio.play(wave) + for l in range(len(pixels)): + pixels[l] = colorwheel( int(i*speed + l * delta_hue) % 255 ) + pixels.show() + time.sleep(1) + pixels.fill((0, 0, 0)) + print('shake') diff --git a/CircuitPython_Sound_Box_2/wavs/AQUA color.wav b/CircuitPython_Sound_Box_2/wavs/AQUA color.wav new file mode 100755 index 000000000..2ad1b2a63 Binary files /dev/null and b/CircuitPython_Sound_Box_2/wavs/AQUA color.wav differ diff --git a/CircuitPython_Sound_Box_2/wavs/BLUE color.wav b/CircuitPython_Sound_Box_2/wavs/BLUE color.wav new file mode 100755 index 000000000..22e946d85 Binary files /dev/null and b/CircuitPython_Sound_Box_2/wavs/BLUE color.wav differ diff --git a/CircuitPython_Sound_Box_2/wavs/GREEN color.wav b/CircuitPython_Sound_Box_2/wavs/GREEN color.wav new file mode 100755 index 000000000..4b68d9f7f Binary files /dev/null and b/CircuitPython_Sound_Box_2/wavs/GREEN color.wav differ diff --git a/CircuitPython_Sound_Box_2/wavs/ORANGE color.wav b/CircuitPython_Sound_Box_2/wavs/ORANGE color.wav new file mode 100755 index 000000000..a58329802 Binary files /dev/null and b/CircuitPython_Sound_Box_2/wavs/ORANGE color.wav differ diff --git a/CircuitPython_Sound_Box_2/wavs/PINK color.wav b/CircuitPython_Sound_Box_2/wavs/PINK color.wav new file mode 100755 index 000000000..8d2b250a9 Binary files /dev/null and b/CircuitPython_Sound_Box_2/wavs/PINK color.wav differ diff --git a/CircuitPython_Sound_Box_2/wavs/PURPLE color.wav b/CircuitPython_Sound_Box_2/wavs/PURPLE color.wav new file mode 100755 index 000000000..3df62a26c Binary files /dev/null and b/CircuitPython_Sound_Box_2/wavs/PURPLE color.wav differ diff --git a/CircuitPython_Sound_Box_2/wavs/RED color.wav b/CircuitPython_Sound_Box_2/wavs/RED color.wav new file mode 100755 index 000000000..ca19cb81c Binary files /dev/null and b/CircuitPython_Sound_Box_2/wavs/RED color.wav differ diff --git a/CircuitPython_Sound_Box_2/wavs/SHAKE adabot.wav b/CircuitPython_Sound_Box_2/wavs/SHAKE adabot.wav new file mode 100755 index 000000000..cdff423be Binary files /dev/null and b/CircuitPython_Sound_Box_2/wavs/SHAKE adabot.wav differ diff --git a/CircuitPython_Sound_Box_2/wavs/SHAKE excellent.wav b/CircuitPython_Sound_Box_2/wavs/SHAKE excellent.wav new file mode 100755 index 000000000..9fda38e28 Binary files /dev/null and b/CircuitPython_Sound_Box_2/wavs/SHAKE excellent.wav differ diff --git a/CircuitPython_Sound_Box_2/wavs/SHAKE what.wav b/CircuitPython_Sound_Box_2/wavs/SHAKE what.wav new file mode 100755 index 000000000..be9c181a6 Binary files /dev/null and b/CircuitPython_Sound_Box_2/wavs/SHAKE what.wav differ diff --git a/CircuitPython_Sound_Box_2/wavs/WHITE color.wav b/CircuitPython_Sound_Box_2/wavs/WHITE color.wav new file mode 100755 index 000000000..fd631d381 Binary files /dev/null and b/CircuitPython_Sound_Box_2/wavs/WHITE color.wav differ diff --git a/CircuitPython_Sound_Box_2/wavs/YELLOW color.wav b/CircuitPython_Sound_Box_2/wavs/YELLOW color.wav new file mode 100755 index 000000000..bed9ee8ef Binary files /dev/null and b/CircuitPython_Sound_Box_2/wavs/YELLOW color.wav differ diff --git a/CircuitPython_Templates/adafruit_io_cpu_temp_neopixel_color/code.py b/CircuitPython_Templates/adafruit_io_cpu_temp_neopixel_color/code.py index e27c28fde..72a8186c3 100644 --- a/CircuitPython_Templates/adafruit_io_cpu_temp_neopixel_color/code.py +++ b/CircuitPython_Templates/adafruit_io_cpu_temp_neopixel_color/code.py @@ -48,8 +48,8 @@ pool = socketpool.SocketPool(wifi.radio) # Initialize a new MQTT Client object mqtt_client = MQTT.MQTT( broker="io.adafruit.com", - username=os.getenv("ADAFRUIT_IO_USERNAME"), - password=os.getenv("ADAFRUIT_IO_KEY"), + username=os.getenv("ADAFRUIT_AIO_USERNAME"), + password=os.getenv("ADAFRUIT_AIO_KEY"), socket_pool=pool, ssl_context=ssl.create_default_context(), ) diff --git a/CircuitPython_Templates/digital_input_built_in_led_multiple_buttons_rev_tft/code.py b/CircuitPython_Templates/digital_input_built_in_led_multiple_buttons_rev_tft/code.py new file mode 100644 index 000000000..acfc07df9 --- /dev/null +++ b/CircuitPython_Templates/digital_input_built_in_led_multiple_buttons_rev_tft/code.py @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: 2022 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython Multiple Button Digital Input Example - Handling multiple buttons with simple logic. +""" +import time +import board +import digitalio + +# LED setup +led = digitalio.DigitalInOut(board.LED) +led.direction = digitalio.Direction.OUTPUT + +# Button setup +button0 = digitalio.DigitalInOut(board.D0) +button0.switch_to_input(pull=digitalio.Pull.UP) + +button1 = digitalio.DigitalInOut(board.D1) +button1.switch_to_input(pull=digitalio.Pull.DOWN) + +button2 = digitalio.DigitalInOut(board.D2) +button2.switch_to_input(pull=digitalio.Pull.DOWN) + +while True: + # Check Button D0 + if not button0.value: # button0 is active (Pull.UP, active LOW) + print("Button D0 pressed") + led.value = True + # Check Button D1 + elif button1.value: # button1 is active (Pull.DOWN, active HIGH) + print("Button D1 pressed") + led.value = True + # Check Button D2 + elif button2.value: # button2 is active (Pull.DOWN, active HIGH) + print("Button D2 pressed") + led.value = True + else: + led.value = False # No buttons are pressed, turn off the LED + + # Small delay to debounce buttons and reduce serial output spam + time.sleep(0.1) diff --git a/CircuitPython_sdcardio_sdioio/benchmark/code.py b/CircuitPython_sdcardio_sdioio/benchmark/code.py index 57c103caa..6c6a8c5e0 100644 --- a/CircuitPython_sdcardio_sdioio/benchmark/code.py +++ b/CircuitPython_sdcardio_sdioio/benchmark/code.py @@ -5,6 +5,8 @@ import time import os +# pylint: disable=unused-import +import mount_sd # You must create a module mount_sd.py that mounts your sd card! # First, just write the file 'hello.txt' to the card with open("/sd/hello.txt", "w") as f: diff --git a/CircuitPython_sdcardio_sdioio/list_files/code.py b/CircuitPython_sdcardio_sdioio/list_files/code.py index c47f889d8..35d7264ec 100644 --- a/CircuitPython_sdcardio_sdioio/list_files/code.py +++ b/CircuitPython_sdcardio_sdioio/list_files/code.py @@ -4,6 +4,9 @@ import os +# pylint: disable=unused-import +import mount_sd # You must create a module mount_sd.py that mounts your sd card! + def print_directory(path, tabs=0): for file in os.listdir(path): stats = os.stat(path + "/" + file) diff --git a/CircuitPython_sdcardio_sdioio/log_temperature/code.py b/CircuitPython_sdcardio_sdioio/log_temperature/code.py index 8331a2dec..ed4c4464b 100644 --- a/CircuitPython_sdcardio_sdioio/log_temperature/code.py +++ b/CircuitPython_sdcardio_sdioio/log_temperature/code.py @@ -8,6 +8,9 @@ import board import digitalio import microcontroller +# pylint: disable=unused-import +import mount_sd # You must create a module mount_sd.py that mounts your sd card! + led = digitalio.DigitalInOut(board.D13) led.direction = digitalio.Direction.OUTPUT diff --git a/CircuitPython_sdcardio_sdioio/play_mp3s/code.py b/CircuitPython_sdcardio_sdioio/play_mp3s/code.py index dda43c5c6..4f43cdfa0 100644 --- a/CircuitPython_sdcardio_sdioio/play_mp3s/code.py +++ b/CircuitPython_sdcardio_sdioio/play_mp3s/code.py @@ -8,6 +8,9 @@ import time import board import digitalio +# pylint: disable=unused-import +import mount_sd # You must create a module mount_sd.py that mounts your sd card! + # Updating the display can interfere with MP3 playback if it is not # done carefully try: diff --git a/Circuit_Playground_Express_IR_Treasure_Hunt/CPX_Treasure/code.py b/Circuit_Playground_Express_IR_Treasure_Hunt/CPX_Treasure/code.py index e3e304aad..e94cf4a47 100644 --- a/Circuit_Playground_Express_IR_Treasure_Hunt/CPX_Treasure/code.py +++ b/Circuit_Playground_Express_IR_Treasure_Hunt/CPX_Treasure/code.py @@ -19,9 +19,9 @@ pixels = neopixel.NeoPixel(board.NEOPIXEL, 10) pulseout = pulseio.PulseOut(board.IR_TX, frequency=38000, duty_cycle=2 ** 15) # Create an encoder that will take numbers and turn them into IR pulses -encoder = adafruit_irremote.GenericTransmit(header=[9500, 4500], - one=[550, 550], - zero=[550, 1700], +encoder = adafruit_irremote.GenericTransmit(header=[9000, 4500], + one=[560, 1700], + zero=[560, 560], trail=0) while True: diff --git a/Circuit_Playground_Express_IR_Zombie_Game/code.py b/Circuit_Playground_Express_IR_Zombie_Game/code.py index c482905d5..c889c609a 100755 --- a/Circuit_Playground_Express_IR_Zombie_Game/code.py +++ b/Circuit_Playground_Express_IR_Zombie_Game/code.py @@ -28,8 +28,10 @@ decoder = adafruit_irremote.GenericDecode() # Create a 'pulseio' output, to send infrared signals on the IR transmitter @ 38KHz pulseout = pulseio.PulseOut(board.IR_TX, frequency=38000, duty_cycle=2 ** 15) # Create an encoder that will take numbers and turn them into NEC IR pulses -encoder = adafruit_irremote.GenericTransmit(header=[9500, 4500], one=[550, 550], - zero=[550, 1700], trail=0) +encoder = adafruit_irremote.GenericTransmit(header=[9000, 4500], + one=[560, 1700], + zero=[560, 560], + trail=0) # Set between 0 and 1 to set LED pulse speed. Smaller numbers are slower. healer_led_pulse = 0.008 diff --git a/Circuit_Playground_Express_and_IR/CPX_IR_CPX_transmit/code.py b/Circuit_Playground_Express_and_IR/CPX_IR_CPX_transmit/code.py index 22dc97e00..7b3d778bf 100644 --- a/Circuit_Playground_Express_and_IR/CPX_IR_CPX_transmit/code.py +++ b/Circuit_Playground_Express_and_IR/CPX_IR_CPX_transmit/code.py @@ -11,8 +11,10 @@ import board # Create a 'pulseio' output, to send infrared signals on the IR transmitter @ 38KHz pulseout = pulseio.PulseOut(board.IR_TX, frequency=38000, duty_cycle=2 ** 15) # Create an encoder that will take numbers and turn them into NEC IR pulses -encoder = adafruit_irremote.GenericTransmit(header=[9500, 4500], one=[550, 550], - zero=[550, 1700], trail=0) +encoder = adafruit_irremote.GenericTransmit(header=[9000, 4500], + one=[560, 1700], + zero=[560, 560], + trail=0) while True: if cpx.button_a: diff --git a/Custom_LED_Animations/conways/code.py b/Custom_LED_Animations/conways/code.py new file mode 100644 index 000000000..4a75a5fd3 --- /dev/null +++ b/Custom_LED_Animations/conways/code.py @@ -0,0 +1,30 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT +import board +import neopixel + +from conways import ConwaysLifeAnimation + +# Update to match the pin connected to your NeoPixels +pixel_pin = board.D10 +# Update to match the number of NeoPixels you have connected +pixel_num = 32 + +# initialize the neopixels. Change out for dotstars if needed. +pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=0.02, auto_write=False) + +initial_cells = [ + (2, 1), + (3, 1), + (4, 1), + (5, 1), + (6, 1), +] + +# initialize the animation +conways = ConwaysLifeAnimation(pixels, 1.0, 0xff00ff, 8, 4, initial_cells) + +while True: + # call animation to show the next animation frame + conways.animate() diff --git a/Custom_LED_Animations/conways/conways.py b/Custom_LED_Animations/conways/conways.py new file mode 100644 index 000000000..d6c3c89ad --- /dev/null +++ b/Custom_LED_Animations/conways/conways.py @@ -0,0 +1,192 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +ConwaysLifeAnimation helper class +""" +from micropython import const + +from adafruit_led_animation.animation import Animation +from adafruit_led_animation.grid import PixelGrid, HORIZONTAL + + +def _is_pixel_off(pixel): + return pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0 + + +class ConwaysLifeAnimation(Animation): + # Constants + DIRECTION_OFFSETS = [ + (0, 1), + (0, -1), + (1, 0), + (-1, 0), + (1, 1), + (-1, 1), + (1, -1), + (-1, -1), + ] + LIVE = const(0x01) + DEAD = const(0x00) + + def __init__( + self, + pixel_object, + speed, + color, + width, + height, + initial_cells, + equilibrium_restart=True, + ): + """ + Conway's Game of Life implementation. Watch the cells + live and die based on the classic rules. + + :param pixel_object: The initialised LED object. + :param float speed: Animation refresh rate in seconds, e.g. ``0.1``. + :param color: the color to use for live cells + :param width: the width of the grid + :param height: the height of the grid + :param initial_cells: list of initial cells to be live + :param equilibrium_restart: whether to restart when the simulation gets stuck unchanging + """ + super().__init__(pixel_object, speed, color) + + # list to hold which cells are live + self.drawn_pixels = [] + + # store the initial cells + self.initial_cells = initial_cells + + # PixelGrid helper to access the strand as a 2D grid + self.pixel_grid = PixelGrid( + pixel_object, width, height, orientation=HORIZONTAL, alternating=False + ) + + # size of the grid + self.width = width + self.height = height + + # equilibrium restart boolean + self.equilibrium_restart = equilibrium_restart + + # counter to store how many turns since the last change + self.equilibrium_turns = 0 + + # self._init_cells() + + def _is_grid_empty(self): + """ + Checks if the grid is empty. + + :return: True if there are no live cells, False otherwise + """ + for y in range(self.height): + for x in range(self.width): + if not _is_pixel_off(self.pixel_grid[x][y]): + return False + + return True + + def _init_cells(self): + """ + Turn off all LEDs then turn on ones cooresponding to the initial_cells + + :return: None + """ + self.pixel_grid.fill(0x000000) + for cell in self.initial_cells: + self.pixel_grid[cell] = self.color + + def _count_neighbors(self, cell): + """ + Check how many live cell neighbors are found at the given location + :param cell: the location to check + :return: the number of live cell neighbors + """ + neighbors = 0 + for direction in ConwaysLifeAnimation.DIRECTION_OFFSETS: + try: + if not _is_pixel_off( + self.pixel_grid[cell[0] + direction[0]][cell[1] + direction[1]] + ): + neighbors += 1 + except IndexError: + pass + return neighbors + + def draw(self): + # pylint: disable=too-many-branches + """ + draw the current frame of the animation + + :return: None + """ + # if there are no live cells + if self._is_grid_empty(): + # spawn the inital_cells and return + self._init_cells() + return + + # list to hold locations to despawn live cells + despawning_cells = [] + + # list to hold locations spawn new live cells + spawning_cells = [] + + # loop over the grid + for y in range(self.height): + for x in range(self.width): + + # check and set the current cell type, live or dead + if _is_pixel_off(self.pixel_grid[x][y]): + cur_cell_type = ConwaysLifeAnimation.DEAD + else: + cur_cell_type = ConwaysLifeAnimation.LIVE + + # get a count of the neigbors + neighbors = self._count_neighbors((x, y)) + + # if the current cell is alive + if cur_cell_type == ConwaysLifeAnimation.LIVE: + # if it has fewer than 2 neighbors + if neighbors < 2: + # add its location to the despawn list + despawning_cells.append((x, y)) + + # if it has more than 3 neighbors + if neighbors > 3: + # add its location to the despawn list + despawning_cells.append((x, y)) + + # if the current location is not a living cell + elif cur_cell_type == ConwaysLifeAnimation.DEAD: + # if it has exactly 3 neighbors + if neighbors == 3: + # add the current location to the spawn list + spawning_cells.append((x, y)) + + # loop over the despawn locations + for cell in despawning_cells: + # turn off LEDs at each location + self.pixel_grid[cell] = 0x000000 + + # loop over the spawn list + for cell in spawning_cells: + # turn on LEDs at each location + self.pixel_grid[cell] = self.color + + # if equilibrium restart mode is enabled + if self.equilibrium_restart: + # if there were no cells spawned or despaned this round + if len(despawning_cells) == 0 and len(spawning_cells) == 0: + # increment equilibrium turns counter + self.equilibrium_turns += 1 + # if the counter is 3 or higher + if self.equilibrium_turns >= 3: + # go back to the initial_cells + self._init_cells() + + # reset the turns counter to zero + self.equilibrium_turns = 0 diff --git a/Custom_LED_Animations/grid_both/code.py b/Custom_LED_Animations/grid_both/code.py new file mode 100644 index 000000000..0b6cf6b62 --- /dev/null +++ b/Custom_LED_Animations/grid_both/code.py @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT +""" +Uses NeoPixel Featherwing connected to D10 and +Dotstar Featherwing connected to D13, and D11. +Update pins as needed for your connections. +""" +import board +import neopixel +import adafruit_dotstar as dotstar +from conways import ConwaysLifeAnimation +from snake import SnakeAnimation + +# Update to match the pin connected to your NeoPixels +pixel_pin = board.D10 +# Update to match the number of NeoPixels you have connected +pixel_num = 32 + +# initialize the neopixels featherwing +pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=0.02, auto_write=False) + +# initialize the dotstar featherwing +dots = dotstar.DotStar(board.D13, board.D11, 72, brightness=0.02) + +# initial live cells for conways +initial_cells = [ + (2, 1), + (3, 1), + (4, 1), + (5, 1), + (6, 1), +] + +# initialize the animations +conways = ConwaysLifeAnimation(dots, 0.1, 0xff00ff, 12, 6, initial_cells) + +snake = SnakeAnimation(pixels, speed=0.1, color=0xff00ff, width=8, height=4) + +while True: + # call animate to show the next animation frames + conways.animate() + snake.animate() diff --git a/Custom_LED_Animations/grid_both/conways.py b/Custom_LED_Animations/grid_both/conways.py new file mode 100644 index 000000000..d9984f01a --- /dev/null +++ b/Custom_LED_Animations/grid_both/conways.py @@ -0,0 +1,192 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +ConwaysLifeAnimation helper class +""" +from micropython import const + +from adafruit_led_animation.animation import Animation +from adafruit_led_animation.grid import PixelGrid, HORIZONTAL + + +def _is_pixel_off(pixel): + return pixel[0] == 0 and pixel[1] == 0 and pixel[2] == 0 + + +class ConwaysLifeAnimation(Animation): + # Constants + DIRECTION_OFFSETS = [ + (0, 1), + (0, -1), + (1, 0), + (-1, 0), + (1, 1), + (-1, 1), + (1, -1), + (-1, -1), + ] + LIVE = const(0x01) + DEAD = const(0x00) + + def __init__( + self, + pixel_object, + speed, + color, + width, + height, + initial_cells, + equilibrium_restart=True, + ): + """ + Conway's Game of Life implementation. Watch the cells + live and die based on the classic rules. + + :param pixel_object: The initialised LED object. + :param float speed: Animation refresh rate in seconds, e.g. ``0.1``. + :param color: the color to use for live cells + :param width: the width of the grid + :param height: the height of the grid + :param initial_cells: list of initial cells to be live + :param equilibrium_restart: whether to restart when the simulation gets stuck unchanging + """ + super().__init__(pixel_object, speed, color) + + # list to hold which cells are live + self.drawn_pixels = [] + + # store the initial cells + self.initial_cells = initial_cells + + # PixelGrid helper to access the strand as a 2D grid + self.pixel_grid = PixelGrid( + pixel_object, width, height, orientation=HORIZONTAL, alternating=False + ) + + # size of the grid + self.width = width + self.height = height + + # equilibrium restart boolean + self.equilibrium_restart = equilibrium_restart + + # counter to store how many turns since the last change + self.equilibrium_turns = 0 + + # self._init_cells() + + def _is_grid_empty(self): + """ + Checks if the grid is empty. + + :return: True if there are no live cells, False otherwise + """ + for y in range(self.height): + for x in range(self.width): + if not _is_pixel_off(self.pixel_grid[x, y]): + return False + + return True + + def _init_cells(self): + """ + Turn off all LEDs then turn on ones cooresponding to the initial_cells + + :return: None + """ + self.pixel_grid.fill(0x000000) + for cell in self.initial_cells: + self.pixel_grid[cell] = self.color + + def _count_neighbors(self, cell): + """ + Check how many live cell neighbors are found at the given location + :param cell: the location to check + :return: the number of live cell neighbors + """ + neighbors = 0 + for direction in ConwaysLifeAnimation.DIRECTION_OFFSETS: + try: + if not _is_pixel_off( + self.pixel_grid[cell[0] + direction[0], cell[1] + direction[1]] + ): + neighbors += 1 + except IndexError: + pass + return neighbors + + def draw(self): + # pylint: disable=too-many-branches + """ + draw the current frame of the animation + + :return: None + """ + # if there are no live cells + if self._is_grid_empty(): + # spawn the inital_cells and return + self._init_cells() + return + + # list to hold locations to despawn live cells + despawning_cells = [] + + # list to hold locations spawn new live cells + spawning_cells = [] + + # loop over the grid + for y in range(self.height): + for x in range(self.width): + + # check and set the current cell type, live or dead + if _is_pixel_off(self.pixel_grid[x, y]): + cur_cell_type = ConwaysLifeAnimation.DEAD + else: + cur_cell_type = ConwaysLifeAnimation.LIVE + + # get a count of the neigbors + neighbors = self._count_neighbors((x, y)) + + # if the current cell is alive + if cur_cell_type == ConwaysLifeAnimation.LIVE: + # if it has fewer than 2 neighbors + if neighbors < 2: + # add its location to the despawn list + despawning_cells.append((x, y)) + + # if it has more than 3 neighbors + if neighbors > 3: + # add its location to the despawn list + despawning_cells.append((x, y)) + + # if the current location is not a living cell + elif cur_cell_type == ConwaysLifeAnimation.DEAD: + # if it has exactly 3 neighbors + if neighbors == 3: + # add the current location to the spawn list + spawning_cells.append((x, y)) + + # loop over the despawn locations + for cell in despawning_cells: + # turn off LEDs at each location + self.pixel_grid[cell] = 0x000000 + + # loop over the spawn list + for cell in spawning_cells: + # turn on LEDs at each location + self.pixel_grid[cell] = self.color + + # if equilibrium restart mode is enabled + if self.equilibrium_restart: + # if there were no cells spawned or despaned this round + if len(despawning_cells) == 0 and len(spawning_cells) == 0: + # increment equilibrium turns counter + self.equilibrium_turns += 1 + # if the counter is 3 or higher + if self.equilibrium_turns >= 3: + # go back to the initial_cells + self._init_cells() + + # reset the turns counter to zero + self.equilibrium_turns = 0 diff --git a/Custom_LED_Animations/grid_both/snake.py b/Custom_LED_Animations/grid_both/snake.py new file mode 100644 index 000000000..b1cf6c157 --- /dev/null +++ b/Custom_LED_Animations/grid_both/snake.py @@ -0,0 +1,171 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SnakeAnimation helper class +""" +import random +from micropython import const + +from adafruit_led_animation.animation import Animation +from adafruit_led_animation.grid import PixelGrid, HORIZONTAL + + + +class SnakeAnimation(Animation): + UP = const(0x00) + DOWN = const(0x01) + LEFT = const(0x02) + RIGHT = const(0x03) + ALL_DIRECTIONS = [UP, DOWN, LEFT, RIGHT] + DIRECTION_OFFSETS = { + DOWN: (0, 1), + UP: (0, -1), + RIGHT: (1, 0), + LEFT: (-1, 0) + } + + def __init__(self, pixel_object, speed, color, width, height, snake_length=3): + """ + Renders a snake that slithers around the 2D grid of pixels + """ + super().__init__(pixel_object, speed, color) + + # how many segments the snake will have + self.snake_length = snake_length + + # create a PixelGrid helper to access our strand as a 2D grid + self.pixel_grid = PixelGrid(pixel_object, width, height, + orientation=HORIZONTAL, alternating=False) + + # size variables + self.width = width + self.height = height + + # list that will hold locations of snake segments + self.snake_pixels = [] + + self.direction = None + + # initialize the snake + self._new_snake() + + def _clear_snake(self): + """ + Clear the snake segments and turn off all pixels + """ + while len(self.snake_pixels) > 0: + self.pixel_grid[self.snake_pixels.pop()] = 0x000000 + + def _new_snake(self): + """ + Create a new single segment snake. The snake has a random + direction and location. Turn on the pixel representing the snake. + """ + # choose a random direction and store it + self.direction = random.choice(SnakeAnimation.ALL_DIRECTIONS) + + # choose a random starting tile + starting_tile = (random.randint(0, self.width - 1), random.randint(0, self.height - 1)) + + # add the starting tile to the list of segments + self.snake_pixels.append(starting_tile) + + # turn on the pixel at the chosen location + self.pixel_grid[self.snake_pixels[0]] = self.color + + def _can_move(self, direction): + """ + returns true if the snake can move in the given direction + """ + # location of the next tile if we would move that direction + next_tile = tuple(map(sum, zip( + SnakeAnimation.DIRECTION_OFFSETS[direction], self.snake_pixels[0]))) + + # if the tile is one of the snake segments + if next_tile in self.snake_pixels: + # can't move there + return False + + # if the tile is within the bounds of the grid + if 0 <= next_tile[0] < self.width and 0 <= next_tile[1] < self.height: + # can move there + return True + + # return false if any other conditions not met + return False + + + def _choose_direction(self): + """ + Choose a direction to go in. Could continue in same direction + as it's already going, or decide to turn to a dirction that + will allow movement. + """ + + # copy of all directions in a list + directions_to_check = list(SnakeAnimation.ALL_DIRECTIONS) + + # if we can move the direction we're currently going + if self._can_move(self.direction): + # "flip a coin" + if random.random() < 0.5: + # on "heads" we stay going the same direction + return self.direction + + # loop over the copied list of directions to check + while len(directions_to_check) > 0: + # choose a random one from the list and pop it out of the list + possible_direction = directions_to_check.pop( + random.randint(0, len(directions_to_check)-1)) + # if we can move the chosen direction + if self._can_move(possible_direction): + # return the chosen direction + return possible_direction + + # if we made it through all directions and couldn't move in any of them + # then raise the SnakeStuckException + raise SnakeAnimation.SnakeStuckException + + + def draw(self): + """ + Draw the current frame of the animation + """ + # if the snake is currently the desired length + if len(self.snake_pixels) == self.snake_length: + # remove the last segment from the list and turn it's LED off + self.pixel_grid[self.snake_pixels.pop()] = 0x000000 + + # if the snake is less than the desired length + # e.g. because we removed one in the previous step + if len(self.snake_pixels) < self.snake_length: + # wrap with try to catch the SnakeStuckException + try: + # update the direction, could continue straight, or could change + self.direction = self._choose_direction() + + # the location of the next tile where the head of the snake will move to + next_tile = tuple(map(sum, zip( + SnakeAnimation.DIRECTION_OFFSETS[self.direction], self.snake_pixels[0]))) + + # insert the next tile at list index 0 + self.snake_pixels.insert(0, next_tile) + + # turn on the LED for the tile + self.pixel_grid[next_tile] = self.color + + # if the snake exception is caught + except SnakeAnimation.SnakeStuckException: + # clear the snake to get rid of the old one + self._clear_snake() + + # make a new snake + self._new_snake() + + class SnakeStuckException(RuntimeError): + """ + Exception indicating the snake is stuck and can't move in any direction + """ + def __init__(self): + super().__init__("SnakeStuckException") diff --git a/Custom_LED_Animations/rainbow_sweep/code.py b/Custom_LED_Animations/rainbow_sweep/code.py new file mode 100644 index 000000000..5ed7784cc --- /dev/null +++ b/Custom_LED_Animations/rainbow_sweep/code.py @@ -0,0 +1,23 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT +import board +import neopixel + +from rainbowsweep import RainbowSweepAnimation + +# Update to match the pin connected to your NeoPixels +pixel_pin = board.D10 +# Update to match the number of NeoPixels you have connected +pixel_num = 32 + +# initialize the neopixels. Change out for dotstars if needed. +pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=0.02, auto_write=False) + +# initialize the animation +rainbowsweep = RainbowSweepAnimation(pixels, speed=0.05, color=0x000000, sweep_speed=0.1, + sweep_direction=RainbowSweepAnimation.DIRECTION_END_TO_START) + +while True: + # call animation to show the next animation frame + rainbowsweep.animate() diff --git a/Custom_LED_Animations/rainbow_sweep/rainbowsweep.py b/Custom_LED_Animations/rainbow_sweep/rainbowsweep.py new file mode 100644 index 000000000..ff73929cc --- /dev/null +++ b/Custom_LED_Animations/rainbow_sweep/rainbowsweep.py @@ -0,0 +1,145 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +""" +Adapted From `adafruit_led_animation.animation.rainbow` +""" + +from adafruit_led_animation.animation import Animation +from adafruit_led_animation.color import colorwheel +from adafruit_led_animation import MS_PER_SECOND, monotonic_ms + + +class RainbowSweepAnimation(Animation): + """ + The classic rainbow color wheel that gets swept across by another specified color. + + :param pixel_object: The initialised LED object. + :param float speed: Animation refresh rate in seconds, e.g. ``0.1``. + :param float sweep_speed: How long in seconds to wait between sweep steps + :param float period: Period to cycle the rainbow over in seconds. Default 1. + :param sweep_direction: which way to sweep across the rainbow. Must be one of + DIRECTION_START_TO_END or DIRECTION_END_TO_START + :param str name: Name of animation (optional, useful for sequences and debugging). + + """ + + # constants to represent the different directions + DIRECTION_START_TO_END = 0 + DIRECTION_END_TO_START = 1 + # pylint: disable=too-many-arguments + def __init__( + self, pixel_object, speed, color, sweep_speed=0.3, period=1, + name=None, sweep_direction=DIRECTION_START_TO_END + ): + super().__init__(pixel_object, speed, color, name=name) + self._period = period + # internal var step used inside of color generator + self._step = 256 // len(pixel_object) + + # internal var wheel_index used inside of color generator + self._wheel_index = 0 + + # instance of the generator + self._generator = self._color_wheel_generator() + + # convert swap speed from seconds to ms and store it + self._sweep_speed = sweep_speed * 1000 + + # set the initial sweep index + self.sweep_index = len(pixel_object) + + # internal variable to store the timestamp of when a sweep step occurs + self._last_sweep_time = 0 + + # store the direction argument + self.direction = sweep_direction + + # this animation supports on cycle complete callbacks + on_cycle_complete_supported = True + + def _color_wheel_generator(self): + # convert period to ms + period = int(self._period * MS_PER_SECOND) + + # how many pixels in the strand + num_pixels = len(self.pixel_object) + + # current timestamp + last_update = monotonic_ms() + + cycle_position = 0 + last_pos = 0 + while True: + cycle_completed = False + # time vars + now = monotonic_ms() + time_since_last_draw = now - last_update + last_update = now + + # cycle position vars + pos = cycle_position = (cycle_position + time_since_last_draw) % period + + # if it's time to signal cycle complete + if pos < last_pos: + cycle_completed = True + + # update position var for next iteration + last_pos = pos + + # calculate wheel_index + wheel_index = int((pos / period) * 256) + + # set all pixels to their color based on the wheel color and step + self.pixel_object[:] = [ + colorwheel(((i * self._step) + wheel_index) % 255) for i in range(num_pixels) + ] + + # if it's time for a sweep step + if self._last_sweep_time + self._sweep_speed <= now: + + # udpate sweep timestamp + self._last_sweep_time = now + + # decrement the sweep index + self.sweep_index -= 1 + + # if it's finished the last step + if self.sweep_index == -1: + # reset it to the number of pixels in the strand + self.sweep_index = len(self.pixel_object) + + # if end to start direction + if self.direction == self.DIRECTION_END_TO_START: + # set the current pixels at the end of the strand to the specified color + self.pixel_object[self.sweep_index:] = ( + [self.color] * (len(self.pixel_object) - self.sweep_index)) + + # if start to end direction + elif self.direction == self.DIRECTION_START_TO_END: + # set the pixels at the begining of the strand to the specified color + inverse_index = len(self.pixel_object) - self.sweep_index + self.pixel_object[:inverse_index] = [self.color] * (inverse_index) + + # update the wheel index + self._wheel_index = wheel_index + + # signal cycle complete if it's time + if cycle_completed: + self.cycle_complete = True + yield + + + def draw(self): + """ + draw the current frame of the animation + :return: + """ + next(self._generator) + + def reset(self): + """ + Resets the animation. + """ + self._generator = self._color_wheel_generator() diff --git a/Custom_LED_Animations/snake/code.py b/Custom_LED_Animations/snake/code.py new file mode 100644 index 000000000..c202dfae1 --- /dev/null +++ b/Custom_LED_Animations/snake/code.py @@ -0,0 +1,22 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT +import board +import neopixel + +from snake import SnakeAnimation + +# Update to match the pin connected to your NeoPixels +pixel_pin = board.D10 +# Update to match the number of NeoPixels you have connected +pixel_num = 32 + +# initialize the neopixels. Change out for dotstars if needed. +pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=0.02, auto_write=False) + +# initialize the animation +snake = SnakeAnimation(pixels, speed=0.1, color=0xff00ff, width=8, height=4) + +while True: + # call animation to show the next animation frame + snake.animate() diff --git a/Custom_LED_Animations/snake/snake.py b/Custom_LED_Animations/snake/snake.py new file mode 100644 index 000000000..b1cf6c157 --- /dev/null +++ b/Custom_LED_Animations/snake/snake.py @@ -0,0 +1,171 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SnakeAnimation helper class +""" +import random +from micropython import const + +from adafruit_led_animation.animation import Animation +from adafruit_led_animation.grid import PixelGrid, HORIZONTAL + + + +class SnakeAnimation(Animation): + UP = const(0x00) + DOWN = const(0x01) + LEFT = const(0x02) + RIGHT = const(0x03) + ALL_DIRECTIONS = [UP, DOWN, LEFT, RIGHT] + DIRECTION_OFFSETS = { + DOWN: (0, 1), + UP: (0, -1), + RIGHT: (1, 0), + LEFT: (-1, 0) + } + + def __init__(self, pixel_object, speed, color, width, height, snake_length=3): + """ + Renders a snake that slithers around the 2D grid of pixels + """ + super().__init__(pixel_object, speed, color) + + # how many segments the snake will have + self.snake_length = snake_length + + # create a PixelGrid helper to access our strand as a 2D grid + self.pixel_grid = PixelGrid(pixel_object, width, height, + orientation=HORIZONTAL, alternating=False) + + # size variables + self.width = width + self.height = height + + # list that will hold locations of snake segments + self.snake_pixels = [] + + self.direction = None + + # initialize the snake + self._new_snake() + + def _clear_snake(self): + """ + Clear the snake segments and turn off all pixels + """ + while len(self.snake_pixels) > 0: + self.pixel_grid[self.snake_pixels.pop()] = 0x000000 + + def _new_snake(self): + """ + Create a new single segment snake. The snake has a random + direction and location. Turn on the pixel representing the snake. + """ + # choose a random direction and store it + self.direction = random.choice(SnakeAnimation.ALL_DIRECTIONS) + + # choose a random starting tile + starting_tile = (random.randint(0, self.width - 1), random.randint(0, self.height - 1)) + + # add the starting tile to the list of segments + self.snake_pixels.append(starting_tile) + + # turn on the pixel at the chosen location + self.pixel_grid[self.snake_pixels[0]] = self.color + + def _can_move(self, direction): + """ + returns true if the snake can move in the given direction + """ + # location of the next tile if we would move that direction + next_tile = tuple(map(sum, zip( + SnakeAnimation.DIRECTION_OFFSETS[direction], self.snake_pixels[0]))) + + # if the tile is one of the snake segments + if next_tile in self.snake_pixels: + # can't move there + return False + + # if the tile is within the bounds of the grid + if 0 <= next_tile[0] < self.width and 0 <= next_tile[1] < self.height: + # can move there + return True + + # return false if any other conditions not met + return False + + + def _choose_direction(self): + """ + Choose a direction to go in. Could continue in same direction + as it's already going, or decide to turn to a dirction that + will allow movement. + """ + + # copy of all directions in a list + directions_to_check = list(SnakeAnimation.ALL_DIRECTIONS) + + # if we can move the direction we're currently going + if self._can_move(self.direction): + # "flip a coin" + if random.random() < 0.5: + # on "heads" we stay going the same direction + return self.direction + + # loop over the copied list of directions to check + while len(directions_to_check) > 0: + # choose a random one from the list and pop it out of the list + possible_direction = directions_to_check.pop( + random.randint(0, len(directions_to_check)-1)) + # if we can move the chosen direction + if self._can_move(possible_direction): + # return the chosen direction + return possible_direction + + # if we made it through all directions and couldn't move in any of them + # then raise the SnakeStuckException + raise SnakeAnimation.SnakeStuckException + + + def draw(self): + """ + Draw the current frame of the animation + """ + # if the snake is currently the desired length + if len(self.snake_pixels) == self.snake_length: + # remove the last segment from the list and turn it's LED off + self.pixel_grid[self.snake_pixels.pop()] = 0x000000 + + # if the snake is less than the desired length + # e.g. because we removed one in the previous step + if len(self.snake_pixels) < self.snake_length: + # wrap with try to catch the SnakeStuckException + try: + # update the direction, could continue straight, or could change + self.direction = self._choose_direction() + + # the location of the next tile where the head of the snake will move to + next_tile = tuple(map(sum, zip( + SnakeAnimation.DIRECTION_OFFSETS[self.direction], self.snake_pixels[0]))) + + # insert the next tile at list index 0 + self.snake_pixels.insert(0, next_tile) + + # turn on the LED for the tile + self.pixel_grid[next_tile] = self.color + + # if the snake exception is caught + except SnakeAnimation.SnakeStuckException: + # clear the snake to get rid of the old one + self._clear_snake() + + # make a new snake + self._new_snake() + + class SnakeStuckException(RuntimeError): + """ + Exception indicating the snake is stuck and can't move in any direction + """ + def __init__(self): + super().__init__("SnakeStuckException") diff --git a/Custom_LED_Animations/strand_sequence/code.py b/Custom_LED_Animations/strand_sequence/code.py new file mode 100644 index 000000000..ca9896da0 --- /dev/null +++ b/Custom_LED_Animations/strand_sequence/code.py @@ -0,0 +1,36 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT +import board + +import neopixel +from adafruit_led_animation.color import PINK, JADE +from adafruit_led_animation.sequence import AnimationSequence + +from rainbowsweep import RainbowSweepAnimation +from sweep import SweepAnimation +from zipper import ZipperAnimation + +# Update to match the pin connected to your NeoPixels +pixel_pin = board.A1 +# Update to match the number of NeoPixels you have connected +pixel_num = 30 + +# initialize the neopixels. Change out for dotstars if needed. +pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=0.02, auto_write=False) + +# initialize the animations +sweep = SweepAnimation(pixels, speed=0.05, color=PINK) + +zipper = ZipperAnimation(pixels, speed=0.1, color=PINK, alternate_color=JADE) + +rainbowsweep = RainbowSweepAnimation(pixels, speed=0.05, color=0x000000, sweep_speed=0.1, + sweep_direction=RainbowSweepAnimation.DIRECTION_END_TO_START) + +# sequence to play them all one after another +animations = AnimationSequence( + sweep, zipper, rainbowsweep, advance_interval=6, auto_clear=True +) + +while True: + animations.animate() diff --git a/Custom_LED_Animations/strand_sequence/rainbowsweep.py b/Custom_LED_Animations/strand_sequence/rainbowsweep.py new file mode 100644 index 000000000..ff73929cc --- /dev/null +++ b/Custom_LED_Animations/strand_sequence/rainbowsweep.py @@ -0,0 +1,145 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +""" +Adapted From `adafruit_led_animation.animation.rainbow` +""" + +from adafruit_led_animation.animation import Animation +from adafruit_led_animation.color import colorwheel +from adafruit_led_animation import MS_PER_SECOND, monotonic_ms + + +class RainbowSweepAnimation(Animation): + """ + The classic rainbow color wheel that gets swept across by another specified color. + + :param pixel_object: The initialised LED object. + :param float speed: Animation refresh rate in seconds, e.g. ``0.1``. + :param float sweep_speed: How long in seconds to wait between sweep steps + :param float period: Period to cycle the rainbow over in seconds. Default 1. + :param sweep_direction: which way to sweep across the rainbow. Must be one of + DIRECTION_START_TO_END or DIRECTION_END_TO_START + :param str name: Name of animation (optional, useful for sequences and debugging). + + """ + + # constants to represent the different directions + DIRECTION_START_TO_END = 0 + DIRECTION_END_TO_START = 1 + # pylint: disable=too-many-arguments + def __init__( + self, pixel_object, speed, color, sweep_speed=0.3, period=1, + name=None, sweep_direction=DIRECTION_START_TO_END + ): + super().__init__(pixel_object, speed, color, name=name) + self._period = period + # internal var step used inside of color generator + self._step = 256 // len(pixel_object) + + # internal var wheel_index used inside of color generator + self._wheel_index = 0 + + # instance of the generator + self._generator = self._color_wheel_generator() + + # convert swap speed from seconds to ms and store it + self._sweep_speed = sweep_speed * 1000 + + # set the initial sweep index + self.sweep_index = len(pixel_object) + + # internal variable to store the timestamp of when a sweep step occurs + self._last_sweep_time = 0 + + # store the direction argument + self.direction = sweep_direction + + # this animation supports on cycle complete callbacks + on_cycle_complete_supported = True + + def _color_wheel_generator(self): + # convert period to ms + period = int(self._period * MS_PER_SECOND) + + # how many pixels in the strand + num_pixels = len(self.pixel_object) + + # current timestamp + last_update = monotonic_ms() + + cycle_position = 0 + last_pos = 0 + while True: + cycle_completed = False + # time vars + now = monotonic_ms() + time_since_last_draw = now - last_update + last_update = now + + # cycle position vars + pos = cycle_position = (cycle_position + time_since_last_draw) % period + + # if it's time to signal cycle complete + if pos < last_pos: + cycle_completed = True + + # update position var for next iteration + last_pos = pos + + # calculate wheel_index + wheel_index = int((pos / period) * 256) + + # set all pixels to their color based on the wheel color and step + self.pixel_object[:] = [ + colorwheel(((i * self._step) + wheel_index) % 255) for i in range(num_pixels) + ] + + # if it's time for a sweep step + if self._last_sweep_time + self._sweep_speed <= now: + + # udpate sweep timestamp + self._last_sweep_time = now + + # decrement the sweep index + self.sweep_index -= 1 + + # if it's finished the last step + if self.sweep_index == -1: + # reset it to the number of pixels in the strand + self.sweep_index = len(self.pixel_object) + + # if end to start direction + if self.direction == self.DIRECTION_END_TO_START: + # set the current pixels at the end of the strand to the specified color + self.pixel_object[self.sweep_index:] = ( + [self.color] * (len(self.pixel_object) - self.sweep_index)) + + # if start to end direction + elif self.direction == self.DIRECTION_START_TO_END: + # set the pixels at the begining of the strand to the specified color + inverse_index = len(self.pixel_object) - self.sweep_index + self.pixel_object[:inverse_index] = [self.color] * (inverse_index) + + # update the wheel index + self._wheel_index = wheel_index + + # signal cycle complete if it's time + if cycle_completed: + self.cycle_complete = True + yield + + + def draw(self): + """ + draw the current frame of the animation + :return: + """ + next(self._generator) + + def reset(self): + """ + Resets the animation. + """ + self._generator = self._color_wheel_generator() diff --git a/Custom_LED_Animations/strand_sequence/sweep.py b/Custom_LED_Animations/strand_sequence/sweep.py new file mode 100644 index 000000000..d56a03b3d --- /dev/null +++ b/Custom_LED_Animations/strand_sequence/sweep.py @@ -0,0 +1,68 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SweepAnimation helper class +""" +from adafruit_led_animation.animation import Animation + + +class SweepAnimation(Animation): + + def __init__(self, pixel_object, speed, color): + """ + Sweeps across the strand lighting up one pixel at a time. + Once the full strand is lit, sweeps across again turning off + each pixel one at a time. + + :param pixel_object: The initialized pixel object + :param speed: The speed to run the animation + :param color: The color the pixels will be lit up. + """ + + # Call super class initialization + super().__init__(pixel_object, speed, color) + + # custom variable to store the current step of the animation + self.current_step = 0 + + # one step per pixel + self.last_step = len(pixel_object) + + # boolean indicating whether we're currently sweeping LEDs on or off + self.sweeping_on = True + + self.cycle_complete = False + + # This animation supports the cycle complete callback + on_cycle_complete_supported = True + + def draw(self): + """ + Display the current frame of the animation + + :return: None + """ + if self.sweeping_on: + # Turn on the next LED + self.pixel_object[self.current_step] = self.color + else: # sweeping off + # Turn off the next LED + self.pixel_object[self.current_step] = 0x000000 + + # increment the current step variable + self.current_step += 1 + + # if we've reached the last step + if self.current_step >= self.last_step: + + # if we are currently sweeping off + if not self.sweeping_on: + # signal that the cycle is complete + self.cycle_complete = True + + # reset the step variable to 0 + self.current_step = 0 + + # flop sweeping on/off indicator variable + self.sweeping_on = not self.sweeping_on diff --git a/Custom_LED_Animations/strand_sequence/zipper.py b/Custom_LED_Animations/strand_sequence/zipper.py new file mode 100644 index 000000000..52859ca1c --- /dev/null +++ b/Custom_LED_Animations/strand_sequence/zipper.py @@ -0,0 +1,81 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +ZipperAnimation helper class +""" +from adafruit_led_animation.animation import Animation + + +class ZipperAnimation(Animation): + + def __init__(self, pixel_object, speed, color, alternate_color=None): + """ + Lights up every other LED from each ends of the strand, passing each + other in the middle and resulting in the full strand being lit at the + end of the cycle. + + :param pixel_object: The initialized pixel object + :param speed: The speed to run the animation + :param color: The color the pixels will be lit up. + """ + + # Call super class initialization + super().__init__(pixel_object, speed, color) + + # if alternate color is None then use single color + if alternate_color is None: + self.alternate_color = color + else: + self.alternate_color = alternate_color + + # custom variable to store the current step of the animation + self.current_step = 0 + + # We're lighting up every other LED, so we have half the strand + # length in steps. + self.last_step = len(pixel_object) // 2 + + self.cycle_complete = False + + # This animation supports the cycle complete callback + on_cycle_complete_supported = True + + def draw(self): + """ + Display the current frame of the animation + + :return: None + """ + + # Use try/except to ignore indexes outside the strand + try: + # Turn on 1 even indexed pixel starting from the start of the strand + self.pixel_object[self.current_step * 2] = self.color + + # Turn on 1 odd indexed pixel starting from the end of the strand + self.pixel_object[-(self.current_step * 2) - 1] = self.alternate_color + except IndexError: + pass + + # increment the current step variable + self.current_step += 1 + + # if we've reached the last step + if self.current_step > self.last_step: + # signal that the cycle is complete + self.cycle_complete = True + + # call internal reset() function + self.reset() + + def reset(self): + """ + Turns all the LEDs off and resets the current step variable to 0 + :return: None + """ + # turn LEDs off + self.pixel_object.fill(0x000000) + + # reset current step variable + self.current_step = 0 diff --git a/Custom_LED_Animations/sweep/code.py b/Custom_LED_Animations/sweep/code.py new file mode 100644 index 000000000..ff4da13f5 --- /dev/null +++ b/Custom_LED_Animations/sweep/code.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT +import board +import neopixel + +from sweep import SweepAnimation + +from adafruit_led_animation.color import PINK + +# Update to match the pin connected to your NeoPixels +pixel_pin = board.D10 +# Update to match the number of NeoPixels you have connected +pixel_num = 32 + +# initialize the neopixels. Change out for dotstars if needed. +pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=0.02, auto_write=False) + +# initialize the animation +sweep = SweepAnimation(pixels, speed=0.05, color=PINK) + +while True: + # call animation to show the next animation frame + sweep.animate() diff --git a/Custom_LED_Animations/sweep/sweep.py b/Custom_LED_Animations/sweep/sweep.py new file mode 100644 index 000000000..d56a03b3d --- /dev/null +++ b/Custom_LED_Animations/sweep/sweep.py @@ -0,0 +1,68 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SweepAnimation helper class +""" +from adafruit_led_animation.animation import Animation + + +class SweepAnimation(Animation): + + def __init__(self, pixel_object, speed, color): + """ + Sweeps across the strand lighting up one pixel at a time. + Once the full strand is lit, sweeps across again turning off + each pixel one at a time. + + :param pixel_object: The initialized pixel object + :param speed: The speed to run the animation + :param color: The color the pixels will be lit up. + """ + + # Call super class initialization + super().__init__(pixel_object, speed, color) + + # custom variable to store the current step of the animation + self.current_step = 0 + + # one step per pixel + self.last_step = len(pixel_object) + + # boolean indicating whether we're currently sweeping LEDs on or off + self.sweeping_on = True + + self.cycle_complete = False + + # This animation supports the cycle complete callback + on_cycle_complete_supported = True + + def draw(self): + """ + Display the current frame of the animation + + :return: None + """ + if self.sweeping_on: + # Turn on the next LED + self.pixel_object[self.current_step] = self.color + else: # sweeping off + # Turn off the next LED + self.pixel_object[self.current_step] = 0x000000 + + # increment the current step variable + self.current_step += 1 + + # if we've reached the last step + if self.current_step >= self.last_step: + + # if we are currently sweeping off + if not self.sweeping_on: + # signal that the cycle is complete + self.cycle_complete = True + + # reset the step variable to 0 + self.current_step = 0 + + # flop sweeping on/off indicator variable + self.sweeping_on = not self.sweeping_on diff --git a/Custom_LED_Animations/zipper/code.py b/Custom_LED_Animations/zipper/code.py new file mode 100644 index 000000000..884d8b810 --- /dev/null +++ b/Custom_LED_Animations/zipper/code.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT +import board +import neopixel + +from zipper import ZipperAnimation + +from adafruit_led_animation.color import PINK, JADE + +# Update to match the pin connected to your NeoPixels +pixel_pin = board.D10 +# Update to match the number of NeoPixels you have connected +pixel_num = 32 + +# initialize the neopixels. Change out for dotstars if needed. +pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=0.02, auto_write=False) + +# initialize the animation +zipper = ZipperAnimation(pixels, speed=0.1, color=PINK, alternate_color=JADE) + +while True: + # call animation to show the next animation frame + zipper.animate() diff --git a/Custom_LED_Animations/zipper/zipper.py b/Custom_LED_Animations/zipper/zipper.py new file mode 100644 index 000000000..52859ca1c --- /dev/null +++ b/Custom_LED_Animations/zipper/zipper.py @@ -0,0 +1,81 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +ZipperAnimation helper class +""" +from adafruit_led_animation.animation import Animation + + +class ZipperAnimation(Animation): + + def __init__(self, pixel_object, speed, color, alternate_color=None): + """ + Lights up every other LED from each ends of the strand, passing each + other in the middle and resulting in the full strand being lit at the + end of the cycle. + + :param pixel_object: The initialized pixel object + :param speed: The speed to run the animation + :param color: The color the pixels will be lit up. + """ + + # Call super class initialization + super().__init__(pixel_object, speed, color) + + # if alternate color is None then use single color + if alternate_color is None: + self.alternate_color = color + else: + self.alternate_color = alternate_color + + # custom variable to store the current step of the animation + self.current_step = 0 + + # We're lighting up every other LED, so we have half the strand + # length in steps. + self.last_step = len(pixel_object) // 2 + + self.cycle_complete = False + + # This animation supports the cycle complete callback + on_cycle_complete_supported = True + + def draw(self): + """ + Display the current frame of the animation + + :return: None + """ + + # Use try/except to ignore indexes outside the strand + try: + # Turn on 1 even indexed pixel starting from the start of the strand + self.pixel_object[self.current_step * 2] = self.color + + # Turn on 1 odd indexed pixel starting from the end of the strand + self.pixel_object[-(self.current_step * 2) - 1] = self.alternate_color + except IndexError: + pass + + # increment the current step variable + self.current_step += 1 + + # if we've reached the last step + if self.current_step > self.last_step: + # signal that the cycle is complete + self.cycle_complete = True + + # call internal reset() function + self.reset() + + def reset(self): + """ + Turns all the LEDs off and resets the current step variable to 0 + :return: None + """ + # turn LEDs off + self.pixel_object.fill(0x000000) + + # reset current step variable + self.current_step = 0 diff --git a/EyeLights_Googly_Rings/EyeLights_Googly_Rings/.ledglasses_nrf52840.generate b/DMX_NeoPixels/.uno.test.only similarity index 100% rename from EyeLights_Googly_Rings/EyeLights_Googly_Rings/.ledglasses_nrf52840.generate rename to DMX_NeoPixels/.uno.test.only diff --git a/DMX_NeoPixels/Conceptinetics.cpp b/DMX_NeoPixels/Conceptinetics.cpp new file mode 100755 index 000000000..c2d84d1cf --- /dev/null +++ b/DMX_NeoPixels/Conceptinetics.cpp @@ -0,0 +1,1233 @@ +// SPDX-FileCopyrightText: 2013 W.A. van der Meeren +// +// SPDX-License-Identifier: LGPL-3.0-or-later +/* + Conceptinetics.cpp - DMX library for Arduino + Copyright (c) 2013 W.A. van der Meeren . All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + This code has been tested using the following hardware: + + - Arduino UNO R3 using a CTC-DRA-13-1 ISOLATED DMX-RDM SHIELD + - Arduino MEGA2560 R3 using a CTC-DRA-13-1 ISOLATED DMX-RDM SHIELD +*/ + + +#include "pins_arduino.h" +#include "Conceptinetics.h" + +#include +#include + +#include +#include + +#include + + +#if defined (USE_DMX_SERIAL_0) + + #if defined (USART__TXC_vect) + #define USART_TX USART__TXC_vect + #elif defined(USART_TX_vect) + #define USART_TX USART_TX_vect + #elif defined(USART0_TX_vect) + #define USART_TX USART0_TX_vect + #endif + + #if defined (USART__RXC_vect) + #define USART_RX USART__RXC_vect + #elif defined(USART_RX_vect) + #define USART_RX USART_RX_vect + #elif defined(USART0_RX_vect) + #define USART_RX USART0_RX_vect + #endif + + #if defined UDR + #define DMX_UDR UDR + #elif defined UDR0 + #define DMX_UDR UDR0 + #endif + + #if defined(UBRRH) && defined(UBRRL) + #define DMX_UBRRH UBRRH + #define DMX_UBRRL UBRRL + #elif defined(UBRR0H) && defined(UBRR0L) + #define DMX_UBRRH UBRR0H + #define DMX_UBRRL UBRR0L + #endif + + #if defined(UCSRA) + #define DMX_UCSRA UCSRA + #elif defined(UCSR0A) + #define DMX_UCSRA UCSR0A + #endif + + #if defined(UCSRB) + #define DMX_UCSRB UCSRB + #elif defined (UCSR0B) + #define DMX_UCSRB UCSR0B + #endif + + #if defined(TXEN) && defined(TXCIE) + #define DMX_TXEN TXEN + #define DMX_TXCIE TXCIE + #elif defined(TXEN0) && defined(TXCIE0) + #define DMX_TXEN TXEN0 + #define DMX_TXCIE TXCIE0 + #endif + + #if defined(RXEN) && defined(RXCIE) + #define DMX_RXEN RXEN + #define DMX_RXCIE RXCIE + #elif defined(RXEN0) && defined(RXCIE0) + #define DMX_RXEN RXEN0 + #define DMX_RXCIE RXCIE0 + #endif + + #if defined(FE) + #define DMX_FE FE + #elif defined(FE0) + #define DMX_FE FE0 + #endif + + #define RX_PIN 0 + #define TX_PIN 1 + +#elif defined (USE_DMX_SERIAL_1) + #define USART_RX USART1_RX_vect + #define USART_TX USART1_TX_vect + #define DMX_UDR UDR1 + #define DMX_UBRRH UBRR1H + #define DMX_UBRRL UBRR1L + #define DMX_UCSRA UCSR1A + #define DMX_UCSRB UCSR1B + #define DMX_TXEN TXEN1 + #define DMX_TXCIE TXCIE1 + #define DMX_RXEN RXEN1 + #define DMX_RXCIE RXCIE1 + #define DMX_FE FE1 + #define RX_PIN 19 + #define TX_PIN 18 +#elif defined (USE_DMX_SERIAL_2) + #define USART_RX USART2_RX_vect + #define USART_TX USART2_TX_vect + #define DMX_UDR UDR2 + #define DMX_UBRRH UBRR2H + #define DMX_UBRRL UBRR2L + #define DMX_UCSRA UCSR2A + #define DMX_UCSRB UCSR2B + #define DMX_TXEN TXEN2 + #define DMX_TXCIE TXCIE2 + #define DMX_RXEN RXEN2 + #define DMX_RXCIE RXCIE2 + #define DMX_FE FE2 + #define RX_PIN 17 + #define TX_PIN 16 +#elif defined (USE_DMX_SERIAL_3) + #define USART_RX USART3_RX_vect + #define USART_TX USART3_TX_vect + #define DMX_UDR UDR3 + #define DMX_UBRRH UBRR3H + #define DMX_UBRRL UBRR3L + #define DMX_UCSRA UCSR3A + #define DMX_UCSRB UCSR3B + #define DMX_TXEN TXEN3 + #define DMX_TXCIE TXCIE3 + #define DMX_RXEN RXEN3 + #define DMX_RXCIE RXCIE3 + #define DMX_FE FE3 + #define RX_PIN 14 + #define TX_PIN 15 +#endif + + +#define LOWBYTE(v) ((uint8_t) (v)) +#define HIGHBYTE(v) ((uint8_t) (((uint16_t) (v)) >> 8)) + +#define BSWAP_16(x) ( (uint8_t)((x) >> 8) | ((uint8_t)(x)) << 8 ) + +namespace isr +{ + enum isrState + { + Idle, + Break, + DmxBreak, + DmxBreakManual, + DmxStartByte, + DmxRecordData, + DmxTransmitData, + RdmBreak, + RdmStartByte, + RdmRecordData, + RdmTransmitData, + RDMTransmitComplete, + }; + + enum isrMode + { + Disabled, + Receive, + DMXTransmit, + DMXTransmitManual, /* Manual break... */ + RDMTransmit, + RDMTransmitNoInt, /* Setup uart but leave interrupt disabled */ + }; +}; + + +DMX_Master *__dmx_master; +DMX_Slave *__dmx_slave; +RDM_Responder *__rdm_responder; + +int8_t __re_pin; // R/W Pin on shield + +isr::isrState __isr_txState; // TX ISR state +isr::isrState __isr_rxState; // RX ISR state + + +void SetISRMode ( isr::isrMode ); + + +DMX_FrameBuffer::DMX_FrameBuffer ( uint16_t buffer_size ) +{ + m_refcount = (uint8_t*) malloc ( sizeof ( uint8_t ) ); + + if ( buffer_size >= DMX_MIN_FRAMESIZE && buffer_size <= DMX_MAX_FRAMESIZE ) + { + m_buffer = (uint8_t*) malloc ( buffer_size ); + if ( m_buffer != NULL ) + { + memset ( (void *)m_buffer, 0x0, buffer_size ); + m_bufferSize = buffer_size; + } + else + m_buffer = 0x0; + } + else + m_bufferSize = 0x0; + + *m_refcount++; +} + +DMX_FrameBuffer::DMX_FrameBuffer ( DMX_FrameBuffer &buffer ) +{ + // Copy references and make sure the parent object does not dispose our + // buffer when deleted and we are still active + this->m_refcount = buffer.m_refcount; + (*this->m_refcount)++; + + this->m_buffer = buffer.m_buffer; + this->m_bufferSize = buffer.m_bufferSize; +} + +DMX_FrameBuffer::~DMX_FrameBuffer ( void ) +{ + // If we are the last object using the + // allocated buffer then free it together + // with the refcounter + if ( --(*m_refcount) == 0 ) + { + if ( m_buffer ) + free ( m_buffer ); + + free ( m_refcount ); + } +} + +uint16_t DMX_FrameBuffer::getBufferSize ( void ) +{ + return m_bufferSize; +} + + +uint8_t DMX_FrameBuffer::getSlotValue ( uint16_t index ) +{ + if (index < m_bufferSize) + return m_buffer[index]; + else + return 0x0; +} + + +void DMX_FrameBuffer::setSlotValue ( uint16_t index, uint8_t value ) +{ + if ( index < m_bufferSize ) + m_buffer[index] = value; +} + + +void DMX_FrameBuffer::setSlotRange ( uint16_t start, uint16_t end, uint8_t value ) +{ + if ( start < m_bufferSize && end < m_bufferSize && start < end ) + memset ( (void *) &m_buffer[start], value, end-start+1 ); +} + +void DMX_FrameBuffer::clear ( void ) +{ + memset ( (void *) m_buffer, 0x0, m_bufferSize ); +} + +uint8_t &DMX_FrameBuffer::operator[] ( uint16_t index ) +{ + return m_buffer[index]; +} + + +DMX_Master::DMX_Master ( DMX_FrameBuffer &buffer, int readEnablePin ) +: m_frameBuffer ( buffer ), + m_autoBreak ( 1 ) // Autobreak generation is default on +{ + setStartCode ( DMX_START_CODE ); + + __re_pin = readEnablePin; + pinMode ( __re_pin, OUTPUT ); + + ::SetISRMode ( isr::Disabled ); +} + +DMX_Master::DMX_Master ( uint16_t maxChannel, int readEnablePin ) +: m_frameBuffer ( maxChannel + DMX_STARTCODE_SIZE ), + m_autoBreak ( 1 ) // Autobreak generation is default on +{ + setStartCode ( DMX_START_CODE ); + + __re_pin = readEnablePin; + pinMode ( __re_pin, OUTPUT ); + + ::SetISRMode ( isr::Disabled ); +} + +DMX_Master::~DMX_Master ( void ) +{ + disable (); // Stop sending + __dmx_master = NULL; +} + +DMX_FrameBuffer &DMX_Master::getBuffer ( void ) +{ + return m_frameBuffer; // Return reference to frame buffer +} + +void DMX_Master::setStartCode ( uint8_t value ) +{ + m_frameBuffer[0] = value; // Set the first byte in our frame buffer +} + +void DMX_Master::setChannelValue ( uint16_t channel, uint8_t value ) +{ + if ( channel > 0 ) // Prevent overwriting the start code + m_frameBuffer.setSlotValue ( channel, value ); +} + +void DMX_Master::setChannelRange ( uint16_t start, uint16_t end, uint8_t value ) +{ + if ( start > 0 ) // Prevent overwriting the start code + m_frameBuffer.setSlotRange ( start, end, value ); +} + + +void DMX_Master::enable ( void ) +{ + __dmx_master = this; + + if ( m_autoBreak ) + ::SetISRMode ( isr::DMXTransmit ); + else + ::SetISRMode ( isr::DMXTransmitManual ); +} + +void DMX_Master::disable ( void ) +{ + ::SetISRMode ( isr::Disabled ); + __dmx_master = NULL; // No active master +} + +void DMX_Master::setAutoBreakMode ( void ) { m_autoBreak = 1; } +void DMX_Master::setManualBreakMode ( void ) { m_autoBreak = 0; } +uint8_t DMX_Master::autoBreakEnabled ( void ) { return m_autoBreak; } + + +uint8_t DMX_Master::waitingBreak ( void ) +{ + return ( __isr_txState == isr::DmxBreakManual ); +} + +void DMX_Master::breakAndContinue ( uint8_t breakLength_us ) +{ + // Only execute if we are the controlling master object + if ( __dmx_master == this && __isr_txState == isr::DmxBreakManual ) + { + pinMode ( TX_PIN, OUTPUT ); + digitalWrite ( TX_PIN, LOW ); // Begin BREAK + + for (uint8_t bl=0; bl(*this); +} + + uint8_t DMX_Slave::getChannelValue ( uint16_t channel ) +{ + return getSlotValue ( channel ); +} + + +uint16_t DMX_Slave::getStartAddress ( void ) +{ + return m_startAddress; +} + +void DMX_Slave::setStartAddress ( uint16_t addr ) +{ + m_startAddress = addr; +} + +void DMX_Slave::onReceiveComplete ( void (*func)(unsigned short) ) +{ + event_onFrameReceived = func; +} + + +bool DMX_Slave::processIncoming ( uint8_t val, bool first ) +{ + static uint16_t idx; + bool rval = false; + + if ( first ) + { + // We could have received less channels then we + // expected.. but still is a complete frame + if (m_state == dmx::dmxData && event_onFrameReceived) + event_onFrameReceived (idx); + + m_state = dmx::dmxStartByte; + } + + switch ( m_state ) + { + case dmx::dmxStartByte: + setSlotValue ( 0, val ); // Store start code + idx = m_startAddress; + m_state = dmx::dmxWaitStartAddress; + + case dmx::dmxWaitStartAddress: + if ( --idx == 0 ) + m_state = dmx::dmxData; + break; + + case dmx::dmxData: + if ( idx++ < getBufferSize() ) + setSlotValue ( idx, val ); + else + { + m_state = dmx::dmxFrameReady; + + // If a onFrameReceived callback is register... + if (event_onFrameReceived) + event_onFrameReceived (idx-2); + + rval = true; + } + break; + } + + return rval; +} + + +uint16_t RDM_FrameBuffer::getBufferSize ( void ) { return sizeof ( m_msg ); } + +uint8_t RDM_FrameBuffer::getSlotValue ( uint16_t index ) +{ + if ( index < sizeof ( m_msg ) ) + return m_msg.d[index]; + else + return 0x0; +} + + +void RDM_FrameBuffer::setSlotValue ( uint16_t index, uint8_t value ) +{ + if ( index < sizeof ( m_msg ) ) + m_msg.d[index] = value; +} + +void RDM_FrameBuffer::clear ( void ) +{ + memset ( (void*)m_msg.d, 0x0, sizeof( m_msg ) ); + m_state = rdm::rdmUnknown; +} + +bool RDM_FrameBuffer::processIncoming ( uint8_t val, bool first ) +{ + static uint16_t idx; + bool rval = false; + + if ( first ) + { + m_state = rdm::rdmStartByte; + m_csRecv.checksum = (uint16_t) 0x0000; + idx = 0; + } + + // Prevent buffer overflow for large messages + if (idx >= sizeof(m_msg)) + return true; + + switch ( m_state ) + { + case rdm::rdmStartByte: + m_msg.startCode = val; + m_state = rdm::rdmSubStartCode; + break; + + case rdm::rdmSubStartCode: + if ( val != 0x01 ) + { + rval = true; // Stop processing data + break; + } + + m_msg.subStartCode = val; + m_state = rdm::rdmMessageLength; + break; + + case rdm::rdmMessageLength: + m_msg.msgLength = val; + m_state = rdm::rdmData; + m_csRecv.checksum = 0xcc + 0x01 + val; // set initial checksum + idx = 3; // buffer index for next byte + break; + + case rdm::rdmData: + m_msg.d[idx++] = val; + m_csRecv.checksum += val; + if ( idx >= m_msg.msgLength ) + m_state = rdm::rdmChecksumHigh; + break; + + case rdm::rdmChecksumHigh: + m_csRecv.csh = val; + m_state = rdm::rdmChecksumLow; + + break; + + case rdm::rdmChecksumLow: + m_csRecv.csl = val; + + if ((m_csRecv.checksum % (uint16_t)0x10000) == m_csRecv.checksum) + { + m_state = rdm::rdmFrameReady; + + // valid checksum ... start processing + processFrame (); + } + + m_state = rdm::rdmUnknown; + rval = true; + break; + }; + + return rval; +} + +bool RDM_FrameBuffer::fetchOutgoing ( volatile uint8_t *udr, bool first ) +{ + static uint16_t idx; + static uint16_t cs; + bool rval = false; + + + if ( first ) + { + m_state = rdm::rdmData; + cs = 0x0; + idx = 0; + } + + switch ( m_state ) + { + case rdm::rdmData: + cs += m_msg.d[idx]; + *udr = m_msg.d[idx++]; + if ( idx >= m_msg.msgLength ) + { + m_state = rdm::rdmChecksumHigh; + } + break; + + case rdm::rdmChecksumHigh: + *udr = (cs >> 8); + m_state = rdm::rdmChecksumLow; + break; + + case rdm::rdmChecksumLow: + *udr = (cs & 0xff); + m_state = rdm::rdmUnknown; + rval = true; + break; + + } + + return rval; +} + + +void (*RDM_Responder::event_onIdentifyDevice)(bool); +void (*RDM_Responder::event_onDeviceLabelChanged)(const char*, uint8_t); +void (*RDM_Responder::event_onDMXStartAddressChanged)(uint16_t); +void (*RDM_Responder::event_onDMXPersonalityChanged)(uint8_t); + +// +// slave parameter is only used to ensure a slave object is present before +// initializing the rdm responder class +// +RDM_Responder::RDM_Responder ( uint16_t m, uint8_t d1, uint8_t d2, + uint8_t d3, uint8_t d4, DMX_Slave &slave ) +: RDM_FrameBuffer ( ), + m_Personalities (1), // Available personlities + m_Personality (1) // Default personality eq 1. +{ + __rdm_responder = this; + m_devid.Initialize ( m, d1, d2, d3, d4 ); + + // Default software version id = 0x00000000 + memset ( (void*)m_SoftwareVersionId, 0x0, 0x4 ); + + // Rdm responder is disabled by default + m_rdmStatus.enabled = false; +} + +RDM_Responder::~RDM_Responder ( void ) +{ + __rdm_responder = NULL; +} + +void RDM_Responder::onIdentifyDevice ( void (*func)(bool) ) +{ + event_onIdentifyDevice = func; +} + +void RDM_Responder::onDeviceLabelChanged ( void (*func) (const char*, uint8_t) ) +{ + event_onDeviceLabelChanged = func; +} + +void RDM_Responder::onDMXStartAddressChanged ( void (*func) (uint16_t) ) +{ + event_onDMXStartAddressChanged = func; +} + +void RDM_Responder::onDMXPersonalityChanged ( void (*func) (uint8_t) ) +{ + event_onDMXPersonalityChanged = func; +} + +void RDM_Responder::setDeviceLabel ( const char *label, size_t len ) +{ + if ( len > RDM_MAX_DEVICELABEL_LENGTH ) + len = RDM_MAX_DEVICELABEL_LENGTH; + + memcpy ( (void *)m_deviceLabel, (void *)label, len ); +} + +#define UID_0 0x12 //ESTA device ID +#define UID_1 0x34 +#define UID_2 0x56 +#define UID_3 0x88 +#define UID_4 0x00 +#define UID_5 0x00 + +#define UID_CS (0xFF *6 +UID_0 +UID_1 +UID_2 +UID_3 +UID_4 +UID_5) + +void RDM_Responder::repondDiscUniqueBranch ( void ) +{ + #if defined(UCSRB) + UCSRB = (1<>8) | 0xaa; + response [21] = (cs>>8) | 0x55; + response [22] = (cs&0xff) | 0xaa; + response [23] = (cs&0xff) | 0x55; + + + // Table 3-2 ANSI_E1-20-2010 <2ms + _delay_us ( MIN_RESPONDER_PACKET_SPACING_USEC ); + + // Fix: 2017, Feb 28: Moved data enable down in order to limit line in marking state time to comply with + // section 3.2.3 + // Set shield to transmit mode (turn arround) + digitalWrite ( __re_pin, HIGH ); + + + for ( int i=0; i<24; i++ ) + { + // Wait until data register is empty + #if defined (UCSR0A) && defined (UDRE0) + while((UCSR0A & (1 <(m_msg.PD); + + pd->protocolVersionMajor = 0x01; + pd->protocolVersionMinor = 0x00; + pd->deviceModelId = BSWAP_16(m_DeviceModelId); + pd->ProductCategory = BSWAP_16(m_ProductCategory); + memcpy ( (void*)pd->SoftwareVersionId, (void*)m_SoftwareVersionId, 4 ); + pd->DMX512FootPrint = BSWAP_16(__dmx_slave->getBufferSize()-1); // eq buffersize-startbyte + pd->DMX512CurrentPersonality = m_Personality; + pd->DMX512NumberPersonalities = m_Personalities; + pd->DMX512StartAddress = BSWAP_16(__dmx_slave->getStartAddress()); + + pd->SubDeviceCount = 0x0; // Sub devices are not supported by this library + pd->SensorCount = 0x0; // Sensors are not yet supported + + m_msg.PDL = sizeof (RDM__DeviceInfoPD); +} + +const uint8_t ManufacturerLabel_P[] PROGMEM = "Conceptinetics"; + +void RDM_Responder::processFrame ( void ) +{ + // If packet is a general broadcast + if ( + m_msg.dstUid.isBroadcast (m_devid.m_id) || + m_devid == m_msg.dstUid + ) + { + // Set default response type + m_msg.portId = rdm::ResponseTypeAck; + + switch ( BSWAP_16(m_msg.PID) ) + { + case rdm::DiscUniqueBranch: + // Check if we are inside the given unique branch... + if ( !m_rdmStatus.mute && + reinterpret_cast(m_msg.PD)->lbound < m_devid && + reinterpret_cast(m_msg.PD)->hbound > m_devid ) + { + // Discovery messages are responded with data only and no breaks + repondDiscUniqueBranch (); + } + break; + + case rdm::DiscMute: + reinterpret_cast(m_msg.PD)->ctrlField = 0x0; + m_msg.PDL = sizeof ( RDM_DiscMuteUnMutePD ); + m_rdmStatus.mute = true; + break; + + case rdm::DiscUnMute: + reinterpret_cast(m_msg.PD)->ctrlField = 0x0; + m_msg.PDL = sizeof ( RDM_DiscMuteUnMutePD ); + m_rdmStatus.mute = false; + break; + + case rdm::SupportedParameters: + // + // Temporary solution... this will become dynamic + // in a later version... + // + m_msg.PD[0] = HIGHBYTE(rdm::DmxStartAddress); // MSB + m_msg.PD[1] = LOWBYTE (rdm::DmxStartAddress); // LSB + + m_msg.PD[2] = HIGHBYTE(rdm::DmxPersonality); + m_msg.PD[3] = LOWBYTE (rdm::DmxPersonality); + + m_msg.PD[4] = HIGHBYTE(rdm::ManufacturerLabel); + m_msg.PD[5] = LOWBYTE (rdm::ManufacturerLabel); + + m_msg.PD[6] = HIGHBYTE(rdm::DeviceLabel); + m_msg.PD[7] = LOWBYTE (rdm::DeviceLabel); + + m_msg.PDL = 0x6; + break; + + // Only for manufacturer specific parameters + // case rdm::ParameterDescription: + // break; + + case rdm::DeviceInfo: + if ( m_msg.CC == rdm::GetCommand ) + populateDeviceInfo (); + break; + + case rdm::DmxStartAddress: + if ( m_msg.CC == rdm::GetCommand ) + { + m_msg.PD[0] = HIGHBYTE(__dmx_slave->getStartAddress ()); + m_msg.PD[1] = LOWBYTE (__dmx_slave->getStartAddress ()); + m_msg.PDL = 0x2; + } + else // if ( m_msg.CC == rdm::SetCommand ) + { + __dmx_slave->setStartAddress ( (m_msg.PD[0] << 8) + m_msg.PD[1] ); + m_msg.PDL = 0x0; + + if ( event_onDMXStartAddressChanged ) + event_onDMXStartAddressChanged ( (m_msg.PD[0] << 8) + m_msg.PD[1] ); + } + break; + + case rdm::DmxPersonality: + if ( m_msg.CC == rdm::GetCommand ) + { + reinterpret_cast + (m_msg.PD)->DMX512CurrentPersonality = m_Personality; + reinterpret_cast + (m_msg.PD)->DMX512CurrentPersonality = m_Personalities; + m_msg.PDL = sizeof (RDM_DeviceGetPersonality_PD); + } + else // if ( m_msg.CC == rdm::SetCommand ) + { + m_Personality = reinterpret_cast + (m_msg.PD)->DMX512Personality; + m_msg.PDL = 0x0; + + if ( event_onDMXPersonalityChanged ) + event_onDMXPersonalityChanged ( m_Personality ); + } + break; + + case rdm::IdentifyDevice: + if ( m_msg.CC == rdm::GetCommand ) + { + m_msg.PD[0] = (uint8_t)(m_rdmStatus.ident ? 1 : 0); + m_msg.PDL = 0x1; + } + else if ( m_msg.CC == rdm::SetCommand ) + { + // Look into first byte to see whether identification + // is turned on or off + m_rdmStatus.ident = m_msg.PD[0] ? true : false; + if ( event_onIdentifyDevice ) + event_onIdentifyDevice ( m_rdmStatus.ident ); + + m_msg.PDL = 0x0; + } + break; + + case rdm::ManufacturerLabel: + if ( m_msg.CC == rdm::GetCommand ) + { + memcpy_P( (void*)m_msg.PD, ManufacturerLabel_P, sizeof(ManufacturerLabel_P) ); + m_msg.PDL = sizeof ( ManufacturerLabel_P ); + } + break; + + case rdm::DeviceLabel: + if ( m_msg.CC == rdm::GetCommand ) + { + memcpy ( m_msg.PD, (void*) m_deviceLabel, 32 ); + m_msg.PDL = 32; + } + else if ( m_msg.CC == rdm::SetCommand ) + { + memset ( (void*) m_deviceLabel, ' ', 32 ); + memcpy ( (void*) m_deviceLabel, m_msg.PD, (m_msg.PDL < 32 ? m_msg.PDL : 32) ); + m_msg.PDL = 0; + + // Notify application + if ( event_onDeviceLabelChanged ) + event_onDeviceLabelChanged ( m_deviceLabel, 32 ); + } + break; + + + default: + // Unknown parameter ID response + m_msg.portId = rdm::ResponseTypeNackReason; + m_msg.PD[0] = rdm::UnknownPid; + m_msg.PD[1] = 0x0; + m_msg.PDL = 0x2; + break; + }; + } + + // + // Only respond if this this message + // was destined to us only + if ( m_msg.dstUid == m_devid ) + { + m_msg.startCode = RDM_START_CODE; + m_msg.subStartCode = 0x01; + m_msg.msgLength = RDM_HDR_LEN + m_msg.PDL; + m_msg.msgCount = 0; + + /* + switch ( m_msg.msg.CC ) + { + case rdm::DiscoveryCommand: + m_msg.msg.CC = rdm::DiscoveryCommandResponse; + break; + case rdm::GetCommand: + m_msg.msg.CC = rdm::GetCommandResponse; + break; + case rdm::SetCommand: + m_msg.msg.CC = rdm::SetCommandResponse; + break; + } + */ + /* Above replaced by next line */ + m_msg.CC++; + + m_msg.dstUid.copy ( m_msg.srcUid ); + m_msg.srcUid.copy ( m_devid ); + + //_delay_us ( MIN_RESPONDER_PACKET_SPACING_USEC ); + SetISRMode ( isr::RDMTransmit ); + + } +} + + +void SetISRMode ( isr::isrMode mode ) +{ + uint8_t readEnable; + +#if defined(USE_DMX_SERIAL_0) + #if defined(UCSRB) && defined (UCSRC) + UCSRC |= (1<>8); + DMX_UBRRL = (unsigned char) ((F_CPU + DMX_BAUD_RATE * 8L) / (DMX_BAUD_RATE * 16L) - 1); + + // Prepare before kicking off ISR + //DMX_UDR = 0x0; + __isr_rxState = isr::Idle; + readEnable = LOW; + DMX_UCSRB = (1<>8); + DMX_UBRRL = (unsigned char) ((F_CPU + DMX_BAUD_RATE * 8L) / (DMX_BAUD_RATE * 16L) - 1); + DMX_UDR = 0x0; + DMX_UCSRB = 0x0; + readEnable = HIGH; + __isr_txState = isr::DmxBreakManual; + break; + + case isr::RDMTransmit: + DMX_UCSRA = 0x0; + DMX_UBRRH = (unsigned char)(((F_CPU + DMX_BREAK_RATE * 8L) / (DMX_BREAK_RATE * 16L) - 1)>>8); + DMX_UBRRL = (unsigned char) ((F_CPU + DMX_BREAK_RATE * 8L) / (DMX_BREAK_RATE * 16L) - 1); + DMX_UDR = 0x0; + + //DMX_UBRRH = (unsigned char)(((F_CPU + DMX_BAUD_RATE * 8L) / (DMX_BAUD_RATE * 16L) - 1)>>8); + //DMX_UBRRL = (unsigned char) ((F_CPU + DMX_BAUD_RATE * 8L) / (DMX_BAUD_RATE * 16L) - 1); + DMX_UCSRB = (1< -1) + digitalWrite ( __re_pin, readEnable ); + +} + +// +// TX UART (DMX Transmission ISR) +// +ISR (USART_TX) +{ + static uint16_t current_slot; + + switch ( __isr_txState ) + { + case isr::DmxBreak: + DMX_UCSRA = 0x0; + DMX_UBRRH = (unsigned char)(((F_CPU + DMX_BREAK_RATE * 8L) / (DMX_BREAK_RATE * 16L) - 1)>>8); + DMX_UBRRL = (unsigned char) ((F_CPU + DMX_BREAK_RATE * 8L) / (DMX_BREAK_RATE * 16L) - 1); + DMX_UDR = 0x0; + + if ( __isr_txState == isr::DmxBreak ) + __isr_txState = isr::DmxStartByte; + + break; + + case isr::DmxStartByte: + DMX_UCSRA = 0x0; + DMX_UBRRH = (unsigned char)(((F_CPU + DMX_BAUD_RATE * 8L) / (DMX_BAUD_RATE * 16L) - 1)>>8); + DMX_UBRRL = (unsigned char) ((F_CPU + DMX_BAUD_RATE * 8L) / (DMX_BAUD_RATE * 16L) - 1); + current_slot = 0; + DMX_UDR = __dmx_master->getBuffer()[ current_slot++ ]; + __isr_txState = isr::DmxTransmitData; + break; + + + case isr::DmxTransmitData: + // NOTE: we always send full frames of 513 bytes, this will bring us + // close to 40 frames / sec with no interslot delays + #ifdef DMX_IBG + _delay_us (DMX_IBG); + #endif + + DMX_UDR = __dmx_master->getBuffer().getSlotValue( current_slot++ ); + + // Send 512 channels + if ( current_slot >= DMX_MAX_FRAMESIZE ) + { + if ( __dmx_master->autoBreakEnabled () ) + __isr_txState = isr::DmxBreak; + else + SetISRMode ( isr::DMXTransmitManual ); + } + + break; + +/* case isr::RdmBreak: + DMX_UCSRA = 0x0; + DMX_UBRRH = (unsigned char)(((F_CPU + DMX_BREAK_RATE * 8L) / (DMX_BREAK_RATE * 16L) - 1)>>8); + DMX_UBRRL = (unsigned char) ((F_CPU + DMX_BREAK_RATE * 8L) / (DMX_BREAK_RATE * 16L) - 1); + DMX_UDR = 0x0; + + __isr_txState = isr::RdmStartByte; + + break; +*/ + + case isr::RdmStartByte: + DMX_UCSRA = 0x0; + DMX_UBRRH = (unsigned char)(((F_CPU + DMX_BAUD_RATE * 8L) / (DMX_BAUD_RATE * 16L) - 1)>>8); + DMX_UBRRL = (unsigned char) ((F_CPU + DMX_BAUD_RATE * 8L) / (DMX_BAUD_RATE * 16L) - 1); + + // Write start byte + __rdm_responder->fetchOutgoing ( &DMX_UDR, true ); + __isr_txState = isr::RdmTransmitData; + + break; + + case isr::RdmTransmitData: + // Write rest of data + if ( __rdm_responder->fetchOutgoing ( &DMX_UDR ) ) + __isr_txState = isr::RDMTransmitComplete; + break; + + case isr::RDMTransmitComplete: + SetISRMode ( isr::Receive ); // Start waitin for new data + __isr_txState = isr::Idle; // No tx state + break; + + } +} + + + +// +// RX UART (DMX Reception ISR) +// +ISR (USART_RX) +{ + uint8_t usart_state = DMX_UCSRA; + uint8_t usart_data = DMX_UDR; + + // + // Check for framing error and reset if found + // A framing most likely* indicate a break in our ocasion + // + if ( usart_state & (1<processIncoming ( usart_data, true ); + __isr_rxState = isr::DmxRecordData; + } + else if ( __rdm_responder && + usart_data == RDM_START_CODE && + __rdm_responder->m_rdmStatus.enabled ) + { + // __rdm_responder->clear (); + __rdm_responder->processIncoming ( usart_data, true ); + __isr_rxState = isr::RdmRecordData; + } + else + { + __isr_rxState = isr::Idle; + } + break; + + // Process DMX Data + case isr::DmxRecordData: + if ( __dmx_slave->processIncoming ( usart_data ) ) + __isr_rxState = isr::Idle; + break; + + // Process RDM Data + case isr::RdmRecordData: + if ( __rdm_responder->processIncoming ( usart_data ) ) + __isr_rxState = isr::Idle; + break; + + } + +} + diff --git a/DMX_NeoPixels/Conceptinetics.h b/DMX_NeoPixels/Conceptinetics.h new file mode 100755 index 000000000..af181f367 --- /dev/null +++ b/DMX_NeoPixels/Conceptinetics.h @@ -0,0 +1,383 @@ +// SPDX-FileCopyrightText: 2013 W.A. van der Meeren +// +// SPDX-License-Identifier: LGPL-3.0-or-later +/* + Conceptinetics.h - DMX library for Arduino + Copyright (c) 2013 W.A. van der Meeren . All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + +/* + This code has been tested using the following hardware: + + - Arduino / Genuino UNO R3 using a CTC-DRA-13-1 ISOLATED DMX-RDM SHIELD + - Arduino / Genuino MEGA2560 R3 using a CTC-DRA-13-1 ISOLATED DMX-RDM SHIELD + - Arduino / Genuino Leonardo using a CTC-DRA-13-R2 ISOLATED DMX-RDM SHIELD + + - CTC-DRA-10-1 and CTC-DRA-10-R2 is the Non-isolated costs effective DMX-RDM shield +*/ + + +#ifndef CONCEPTINETICS_H_ +#define CONCEPTINETICS_H_ + +#include +#include + +#include "Rdm_Uid.h" +#include "Rdm_Defines.h" + +#define DMX_MAX_FRAMESIZE 513 // Startbyte + 512 Slots +#define DMX_MIN_FRAMESIZE 2 // Startbyte + 1 Slot + +#define DMX_MAX_FRAMECHANNELS 512 // Maxmim number of channer per frame + +#define DMX_STARTCODE_SIZE 1 // Size of startcode in bytes + +#define DMX_START_CODE 0x0 // Start code for a DMX frame +#define RDM_START_CODE 0xcc // Start code for a RDM frame + +// Uncomment to enable Inter slot delay ) (avg < 76uSec) ... +// mimum is zero according to specification +// #define DMX_IBG 10 // Inter slot time + +// Speed your Arduino is running on in Hz. +#define F_OSC 16000000UL + +// DMX Baudrate, this should be 250000 +#define DMX_BAUD_RATE 250000 + +// The baudrate used to automaticly generate a break within +// your ISR.. make it lower to generate longer breaks +//#define DMX_BREAK_RATE 99900 + +// 2017, Feb 28: Set to appox 176us +#define DMX_BREAK_RATE 49950 + +// Tabel 3-2 ANSI_E1-20-2010 +// Minimum time to allow the datalink to 'turn arround' +#define MIN_RESPONDER_PACKET_SPACING_USEC 176 /*176*/ + +// Define which serial port to use as DMX port, only one can be +// selected at the time by uncommenting one of the following +// lines +#define USE_DMX_SERIAL_0 +//#define USE_DMX_SERIAL_1 +//#define USE_DMX_SERIAL_2 +//#define USE_DMX_SERIAL_3 + +namespace dmx +{ + enum dmxState + { + dmxUnknown, + dmxStartByte, + dmxWaitStartAddress, + dmxData, + dmxFrameReady, + }; +}; + +namespace rdm +{ + enum rdmState + { + rdmUnknown, + rdmStartByte, + rdmSubStartCode, + rdmMessageLength, + rdmData, + rdmChecksumHigh, + rdmChecksumLow, + rdmFrameReady, + }; +}; + +struct IFrameBuffer +{ + virtual uint16_t getBufferSize ( void ) = 0; + + virtual uint8_t getSlotValue ( uint16_t index ) = 0; + virtual void setSlotValue ( uint16_t index, uint8_t value ) = 0; +}; + +class DMX_FrameBuffer : IFrameBuffer +{ + public: + // + // Constructor buffersize = 1-513 + // + DMX_FrameBuffer ( uint16_t buffer_size ); + DMX_FrameBuffer ( DMX_FrameBuffer &buffer ); + ~DMX_FrameBuffer ( void ); + + uint16_t getBufferSize ( void ); + + uint8_t getSlotValue ( uint16_t index ); + void setSlotValue ( uint16_t index, uint8_t value ); + void setSlotRange ( uint16_t start, uint16_t end, uint8_t value ); + void clear ( void ); + + uint8_t &operator[] ( uint16_t index ); + + private: + + uint8_t *m_refcount; + uint16_t m_bufferSize; + uint8_t *m_buffer; +}; + + +// +// DMX Master controller +// +class DMX_Master +{ + public: + // Run the DMX master from a pre allocated frame buffer which + // you have fully under your own control + DMX_Master ( DMX_FrameBuffer &buffer, int readEnablePin ); + + // Run the DMX master by giving a predefined maximum number of + // channels to support + DMX_Master ( uint16_t maxChannel, int readEnablePin ); + + ~DMX_Master ( void ); + + void enable ( void ); // Start transmitting + void disable ( void ); // Stop transmitting + + // Get reference to the internal framebuffer + DMX_FrameBuffer &getBuffer ( void ); + + // Update channel values + void setChannelValue ( uint16_t channel, uint8_t value ); + void setChannelRange ( uint16_t start, uint16_t end, uint8_t value ); + + public: + // + // Manual control over the break period + // + void setAutoBreakMode ( void ); // Generated from ISR + void setManualBreakMode ( void ); // Generate manually + + uint8_t autoBreakEnabled ( void ); + + // We are waiting for a manual break to be generated + uint8_t waitingBreak ( void ); + + // Generate break and start transmission of frame + void breakAndContinue ( uint8_t breakLength_us = 100 ); + + + protected: + void setStartCode ( uint8_t value ); + + + private: + DMX_FrameBuffer m_frameBuffer; + uint8_t m_autoBreak; +}; + + +// +// DMX Slave controller +// +class DMX_Slave : public DMX_FrameBuffer +{ + public: + DMX_Slave ( DMX_FrameBuffer &buffer, int readEnablePin = -1 ); + + // nrChannels is the consecutive DMX512 slots required + // to operate this slave device + DMX_Slave ( uint16_t nrChannels, int readEnablePin = -1 ); + + ~DMX_Slave ( void ); + + void enable ( void ); // Enable receiver + void disable ( void ); // Disable receiver + + + // Get reference to the internal framebuffer + DMX_FrameBuffer &getBuffer ( void ); + + uint8_t getChannelValue ( uint16_t channel ); + + uint16_t getStartAddress ( void ); + void setStartAddress ( uint16_t ); + + + // Process incoming byte from USART + bool processIncoming ( uint8_t val, bool first = false ); + + // Register on receive complete callback in case + // of time critical applications + void onReceiveComplete ( void (*func)(unsigned short) ); + + protected: + + + private: + uint16_t m_startAddress; // Slave start address + dmx::dmxState m_state; + + static void (*event_onFrameReceived)(unsigned short channelsReceived); +}; + + +class RDM_FrameBuffer : public IFrameBuffer +{ + public: + // + // Constructor + // + RDM_FrameBuffer ( void ) {}; + ~RDM_FrameBuffer ( void ) {}; + + uint16_t getBufferSize ( void ); + + uint8_t getSlotValue ( uint16_t index ); + void setSlotValue ( uint16_t index, uint8_t value ); + void clear ( void ); + + uint8_t &operator[] ( uint16_t index ); + + public: // functions to provide access from USART + // Process incoming byte from USART, + // returns false when no more data is accepted + bool processIncoming ( uint8_t val, bool first = false ); + + // Process outgoing byte to USART + // returns false when no more data is available + bool fetchOutgoing ( volatile uint8_t *udr, bool first = false ); + + protected: + // Process received frame + virtual void processFrame ( void ) = 0; + + //private: + protected: + rdm::rdmState m_state; // State for pushing the message in + RDM_Message m_msg; + RDM_Checksum m_csRecv; // Checksum received in rdm message +}; + +// +// RDM_Responder +// +class RDM_Responder : public RDM_FrameBuffer +{ + public: + // + // m = manufacturer id (16bits) + // d1-d4 = device id (32bits) + // + RDM_Responder ( uint16_t m, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4, DMX_Slave &slave); + ~RDM_Responder ( void ); + + void setDeviceInfo + ( + uint16_t deviceModelId, + rdm::RdmProductCategory productCategory, + uint8_t personalities = 1, + uint8_t personality = 1 + ) + { + m_DeviceModelId = deviceModelId; + m_ProductCategory = productCategory; + m_Personalities = personalities; + m_Personality = personality; + }; + + // + // Set vendor software version id + // + // v1 = MOST SIGNIFICANT + // v2... + // v3... + // v4 = LEAST SIGNIFICANT + // + void setSoftwareVersionId ( uint8_t v1, uint8_t v2, uint8_t v3, uint8_t v4 ) + { + m_SoftwareVersionId[0] = v1; + m_SoftwareVersionId[1] = v2; + m_SoftwareVersionId[2] = v3; + m_SoftwareVersionId[3] = v4; + } + + // Currently no sensors and subdevices supported + // void AddSensor ( void ); + // void AddSubDevice ( void ); + + uint8_t getPersonality ( void ) { return m_Personality; }; + void setPersonality ( uint8_t personality ) { m_Personality = personality; }; + + // Register on identify device event handler + void onIdentifyDevice ( void (*func)(bool) ); + void onDeviceLabelChanged ( void (*func) (const char*, uint8_t) ); + void onDMXStartAddressChanged ( void (*func) (uint16_t) ); + void onDMXPersonalityChanged ( void (*func) (uint8_t) ); + + + // Set the device label + void setDeviceLabel ( const char *label, size_t len ); + + // Enable, Disable rdm responder + void enable ( void ) { m_rdmStatus.enabled = true; m_rdmStatus.mute = false; }; + void disable ( void ) { m_rdmStatus.enabled = false; }; + + union + { + uint8_t raw; + struct + { + uint8_t mute:1; + uint8_t ident:1; + uint8_t enabled:1; // Rdm responder enable/disable + }; + } m_rdmStatus; + + + protected: + virtual void processFrame ( void ); + + // Discovery to unque brach packets only requires + // the data part of the packet to be transmitted + // without breaks or header + void repondDiscUniqueBranch ( void ); + + // Helpers for generating response packets which + // have larger datafields + void populateDeviceInfo ( void ); + + private: + RDM_Uid m_devid; // Holds our unique device ID + uint8_t m_Personalities; // The total number of supported personalities + uint8_t m_Personality; // The currently active personality + uint16_t m_DeviceModelId; + uint8_t m_SoftwareVersionId[4]; // 32 bit Software version + rdm::RdmProductCategory m_ProductCategory; + + char m_deviceLabel[32]; // Device label + + static void (*event_onIdentifyDevice)(bool); + static void (*event_onDeviceLabelChanged)(const char*, uint8_t); + static void (*event_onDMXStartAddressChanged)(uint16_t); + static void (*event_onDMXPersonalityChanged)(uint8_t); +}; + + +#endif /* CONCEPTINETICS_H_ */ diff --git a/DMX_NeoPixels/DMX_NeoPixels.ino b/DMX_NeoPixels/DMX_NeoPixels.ino new file mode 100644 index 000000000..065dc0426 --- /dev/null +++ b/DMX_NeoPixels/DMX_NeoPixels.ino @@ -0,0 +1,103 @@ +// SPDX-FileCopyrightText: 2024 John Park for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Use a DMX controller to drive NeoPixel strips +// Arduino Uno or Metro 328 + Conceptinetics DMX Shield +// Recieves incoming DMX messages from controller, translates to NeoPixel + + +#include "Conceptinetics.h" +#include + +// User adjust these for the number of strips, pins, pixels per strip, and color formats: +#define NUM_STRIPS 3 +const int pin_for_strip[] = {A0, A1, A2}; +const int leds_per_strip[] = {30, 20, 30}; +const neoPixelType format_per_strip[] = {NEO_GRB + NEO_KHZ800, NEO_BGR + NEO_KHZ800, NEO_GRB + NEO_KHZ800 }; + +#define CH_PER_STRIP 16 // only 4 used per strip, but 16 is nicer on UI of controllers that have 16 channel/page +#define DMX_CHANNELS (CH_PER_STRIP * NUM_STRIPS) + +const int ledPin = 13; + +Adafruit_NeoPixel *strips[NUM_STRIPS]; + +DMX_Slave dmx_slave ( DMX_CHANNELS ); // Configure a DMX receiving controller +uint16_t channelValues[DMX_CHANNELS]; // Array to store DMX values + + +void setup() { + // Set led pin as output pin + pinMode ( ledPin, OUTPUT ); + digitalWrite(ledPin, HIGH); + + // set up strips + for(int i=0; i< NUM_STRIPS; i++) { + int pin = pin_for_strip[i]; + int num_leds = leds_per_strip[i]; + int format = format_per_strip[i]; + Adafruit_NeoPixel *strip = new Adafruit_NeoPixel(num_leds, pin, format); + strips[i] = strip; + strips[i]->begin(); + } + // light up all the strips RGB to test + for(int i=0; i< NUM_STRIPS; i++) { + strips[i]->fill(0xff0000); + strips[i]->show(); + delay(1000); + strips[i]->fill(0x00ff00); + strips[i]->show(); + delay(1000); + strips[i]->fill(0x0000ff); + strips[i]->show(); + } + delay(1000); + + // Enable DMX receiving interface and start receiving DMX data + dmx_slave.enable (); + dmx_slave.setStartAddress (1); +} + + +void loop() +{ + // Fetch all DMX channel values into the array + for (int i = 0; i < DMX_CHANNELS; i++) { + channelValues[i] = dmx_slave.getChannelValue(i + 1); // Get values starting from channel 1 + } + + for(int i=0; ifill(0x000000); + strips[i]->setPixelColor(strip_pix1, strips[i]->ColorHSV(strip_hue1, channelValues[1+(i*CH_PER_STRIP)], channelValues[2+(i*CH_PER_STRIP)])); //first pixel + strips[i]->setPixelColor(strip_pix2, strips[i]->ColorHSV(strip_hue2, channelValues[5+(i*CH_PER_STRIP)], channelValues[6+(i*CH_PER_STRIP)])); //last pixel + // all the pixels in between + for (int j = strip_pix1; j <= strip_pix2; j++) { + float fraction = float(j - strip_pix1) / float(strip_pix2 - strip_pix1); // Calculate the fraction of the interpolation (0 to 1) + // Interpolate HSV components (Hue, Saturation, Value) + uint16_t interpolated_hue = int(lerp(strip_hue1, strip_hue2, fraction)) % 65536; // Wrap around Hue + uint16_t interpolated_saturation = lerp(channelValues[1+(i*CH_PER_STRIP)], channelValues[5+(i*CH_PER_STRIP)], fraction); + uint16_t interpolated_value = lerp(channelValues[2+(i*CH_PER_STRIP)], channelValues[6+(i*CH_PER_STRIP)], fraction); + + // Set the interpolated color to the pixel + strips[i]->setPixelColor(j, strips[i]->ColorHSV(interpolated_hue, interpolated_saturation, interpolated_value)); + } + } + + for(int i=0; ishow(); + } + + delay(100); +} + +// Linear interpolation function +float lerp(float start, float end, float t) { + return start + (end - start) * t; +} diff --git a/DMX_NeoPixels/Rdm_Defines.h b/DMX_NeoPixels/Rdm_Defines.h new file mode 100644 index 000000000..0accca63d --- /dev/null +++ b/DMX_NeoPixels/Rdm_Defines.h @@ -0,0 +1,315 @@ +// SPDX-FileCopyrightText: 2013 W.A. van der Meeren +// +// SPDX-License-Identifier: LGPL-3.0-or-later +/* + Rdm_Defines.h - DMX library for Arduino with RDM (Remote Device Management) support + Copyright (c) 2013 W.A. van der Meeren . All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#ifndef RDM_DEFINES_H_ +#define RDM_DEFINES_H_ + +#include "Rdm_Uid.h" + +#define RDM_MAX_DEVICELABEL_LENGTH 32 + +namespace rdm +{ + enum RdmCommandClass + { + DiscoveryCommand = 0x10, + DiscoveryCommandResponse, + GetCommand = 0x20, + GetCommandResponse, + SetCommand = 0x30, + SetCommandResponse, + }; + + enum RdmResponseTypes + { + ResponseTypeAck = 0x00, + ResponseTypeAckTimer, + ResponseTypeNackReason, + ResponseTypeAckOverflow, // Additional response data available (see spec) + }; + + enum RdmParameters + { + // Category - Network Management + DiscUniqueBranch = 0x0001, // Required + DiscMute = 0x0002, // Required + DiscUnMute = 0x0003, // Required + + CommsStatus = 0x0015, // Get,Set + + // Category - Status Collection + QueuedMessage = 0x0020, // Get [enum RdmStatusTypes] + StatusMessages = 0x0030, // Get [enum RdmStatusTypes] + StatusIdDescription = 0x0031, // Get + ClearStatusId = 0x0032, // Set + SubDeviceStatusReportThreshold = 0x0033, // Get, Set [enum RdmStatusTypes] + + // Category - RDM Information + // ** Only required if supporting parameters + // beyond the minimum required set + SupportedParameters = 0x0005, // Get, **Required + ParameterDescription = 0x0051, // Get, **Required + + // Category = Product Information + DeviceInfo = 0x0060, // Get, Required + ProductDetailIdList = 0x0070, // Get + DeviceModelDescription = 0x0080, // Get + ManufacturerLabel = 0x0081, // Get + DeviceLabel = 0x0082, // Get, Set + FactoryDefaults = 0x0009, // Get, Set ** + SoftwareVersionLabel = 0x000c, // Get + + // Category - DMX512 Setup + DmxPersonality = 0x00e0, // Get, Set + DmxPersonalityDescription = 0x00e1, // Get + DmxStartAddress = 0x00f0, // Get, Set ** Required if DMX device + SlotInfo = 0x0120, // Get + SlotDescription = 0x0121, // Get + DefaultSlotValue = 0x0122, // Get + + // Category - Sensors + // Category - Dimmer Settings + // Category - Power/Lamp Settings + // Category - Display Settings + // Category - Configuration + + // Category - Control + IdentifyDevice = 0x1000, // Get, Set, Required + ResetDevice = 0x1001, // Set + PowerState = 0x1010, // Get, Set + PerformSelftest = 0x1020, // Get, Set + SelfTestDescription = 0x1021, // Get + }; + + + enum RdmStatusTypes + { + StatusNone = 0x00, + StatusGetLastMessage, + StatusAdvisory, + StatusWarning, + StatusError, + StatusAdvisoryCleared = 0x12, + StatusWarningCleared, + StatusErrorCleared, + }; + + enum RdmProductCategory + { + CategoryNotDeclared = 0x0000, + + // Fixtures - intended as source for illumination + CategoryFixture = 0x0100, + CategoryFixtureFixed = 0x0101, + CategoryFixtureMovingYoke = 0x0102, + CategoryFixtureMovingMirror = 0x0103, + CategoryFixtureOther = 0x01ff, + + // Fixture Accessories - add-ons to fixtures or projectors + CategoryFixtureAccessory = 0x0200, + CategoryFixtureAccessoryColor = 0x0201, + CategoryFixtureAccessoryYoke = 0x0202, + CategoryFixtureAccessoryMirror = 0x0203, + CategoryFixtureAccessoryEffect = 0x0204, + CategoryFixtureAccessoryBeam = 0x0205, + CategoryFixtureAccessoryOther = 0x02ff, + + // Projectors - Light source capable of producing + // realistic images from another media + CategoryProjector = 0x0300, + CategoryProjectorFixed = 0x0301, + CategoryProjectorMovingYoke = 0x0302, + CategoryProjectorMovingMirror = 0x0303, + CategoryProjectorOther = 0x03ff, + + // Atmospheric Effect - earth/wind/fire + CategoryAtmospheric = 0x0400, + CategoryAtmosphericEffect = 0x0401, // Fogger, Hazer, Flame + CategoryAtmosphericPyro = 0x0402, + CategoryAtmosphericOther = 0x04ff, + + // Insensity Control (Specifically dimming equipment) + CategoryDimmer = 0x0500, + CategoryDimmer_AC_Incandescent = 0x0501, + CategoryDimmer_AC_Fluorescent = 0x0502, + CategoryDimmer_AC_Coldcathode = 0x0503, + CategoryDimmer_AC_Nondim = 0x0504, + CategoryDimmer_AC_Elv = 0x0505, + CategoryDimmer_AC_Other = 0x0506, + CategoryDimmer_DC_Level = 0x0507, + CategoryDimmer_DC_PWM = 0x0508, + CategoryDimmer_CS_LED = 0x0509, + CategoryDimmer_Other = 0x05ff, + + // Power control (Other than dimming equipment) + CategoryPower = 0x0600, + CategoryPowerControl = 0x0601, + CategoryPowerSource = 0x0602, + CategoryPowerOther = 0x06ff, + + // Scenic Drive - Including motorized effects + // unrelated to light source + CategoryScenic = 0x0700, + CategoryScenicDrive = 0x0701, + CategoryScenicOther = 0x07ff, + + // DMX Infrastructure, conversion and interfaces + CategoryData = 0x0800, + CategoryDataDistribution = 0x0801, + CategoryDataConversion = 0x0802, + CategoryDataOther = 0x08ff, + + // Audio visual equipment + Category_AV = 0x0900, + Category_AV_Audio = 0x0901, + Category_AV_Video = 0x0902, + Category_AV_Other = 0x09ff, + + // Parameter monitoring equipment + CategoryMonitor = 0x0a00, + CategoryMonitorACLinePower = 0x0a01, + CategoryMonitorDCPower = 0x0a02, + CategoryMonitorEnvironmental = 0x0a03, + CategoryMonitorOther = 0x0aff, + + // Controllers, backup devices + CategoryControl = 0x7000, + CategoryControlController = 0x7001, + CategoryControlBackupdevice = 0x7002, + CategoryControlOther = 0x70ff, + + // Test equipment + CategoryTest = 0x7100, + CategoryTestEquipment = 0x7101, + CategoryTestEquipmentOther = 0x71ff, + + // Miscellaneous + CategoryOther = 0x7fff, + }; + + // + // Product details not yet supported in + // this library + // + enum RdmProductDetail + { + ProductDetailNotDeclared = 0x0000, + }; + + // Only LSB + enum RdmNackReasons + { + UnknownPid = 0x00, + FormatError, + HardwareFault, + ProxyReject, + WriteProtect, + UnsupportedCmdClass, + DataOutOfRange, + BufferFull, + PacketSizeUnsupported, + SubDeviceOutOfRange, + ProxyBufferFull + }; + +}; + + +#define RDM_HDR_LEN 24 // RDM Message header length ** fixed +#define RDM_PD_MAXLEN 32 // RDM Maximum parameter data length 1 - 231 + + +union RDM_Message +{ + uint8_t d[ RDM_HDR_LEN + RDM_PD_MAXLEN ]; + struct + { + uint8_t startCode; // 0 SC_RDM + uint8_t subStartCode; // 1 SC_SUB_MESSAGE + uint8_t msgLength; // 2 Range 24 - 255 + RDM_Uid dstUid; // 3-8 Destination UID + RDM_Uid srcUid; // 9-14 Source UID (sender) + uint8_t TN; // 15 Transaction number + uint8_t portId; // 16 Port ID / Response type + uint8_t msgCount; // 17 + uint16_t subDevice; // 18,19 0=root, 0xffff=all + uint8_t CC; // 20 GET_COMMAND + uint16_t PID; // 21,22 Parameter ID + uint8_t PDL; // 23 Parameter Data length 1-231 + + uint8_t PD[RDM_PD_MAXLEN]; // Parameter Data ... variable length + }; +}; + +union RDM_Checksum +{ + uint16_t checksum; + struct + { + uint8_t csl; + uint8_t csh; + }; +}; + +struct RDM_DiscUniqueBranchPD +{ + RDM_Uid lbound; + RDM_Uid hbound; +}; + +struct RDM_DiscMuteUnMutePD +{ + uint16_t ctrlField; + +// Only for multiple ports +// RDM_Uid bindingUid; +}; + +struct RDM__DeviceInfoPD +{ + uint8_t protocolVersionMajor; + uint8_t protocolVersionMinor; + uint16_t deviceModelId; + uint16_t ProductCategory; // enum RdmProductCategory + uint8_t SoftwareVersionId[4]; + uint16_t DMX512FootPrint; + uint8_t DMX512CurrentPersonality; + uint8_t DMX512NumberPersonalities; + uint16_t DMX512StartAddress; + uint16_t SubDeviceCount; + uint8_t SensorCount; +}; + +struct RDM_DeviceGetPersonality_PD +{ + uint8_t DMX512CurrentPersonality; + uint8_t DMX512NumberPersonalities; +}; + +struct RDM_DeviceSetPersonality_PD +{ + uint8_t DMX512Personality; +}; + + +#endif /* RDM_DEFINES_H_ */ diff --git a/DMX_NeoPixels/Rdm_Uid.h b/DMX_NeoPixels/Rdm_Uid.h new file mode 100644 index 000000000..35c802c63 --- /dev/null +++ b/DMX_NeoPixels/Rdm_Uid.h @@ -0,0 +1,101 @@ +// SPDX-FileCopyrightText: 2013 W.A. van der Meeren +// +// SPDX-License-Identifier: LGPL-3.0-or-later +/* + Rdm_Uid.h - DMX library for Arduino with RDM (Remote Device Management) support + Copyright (c) 2013 W.A. van der Meeren . All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#ifndef RDM_UID_H_ +#define RDM_UID_H_ + +#include + +// +//48 bit UID Representation to identify RDM transponders +// +struct RDM_Uid { + + void Initialize ( uint16_t m, uint8_t d1, uint8_t d2, uint8_t d3, uint8_t d4 ) + { + m_id[0] = ((uint8_t) (((uint16_t) (m)) >> 8)); + m_id[1] = (uint8_t)m; + m_id[2] = d1; + m_id[3] = d2; + m_id[4] = d3; + m_id[5] = d4; + } + + void copy ( const RDM_Uid &orig ) + { + for ( uint8_t i = 0; i < 6; i++ ) + m_id[i] = orig.m_id[i]; + } + + bool operator == ( const RDM_Uid & orig ) const + { + for ( uint8_t i = 0; i < 6; i++ ) + if ( m_id[i] != orig.m_id[i] ) + return false; + + return true; + } + + bool operator != ( const RDM_Uid & orig ) const + { + return !(*this == orig); + } + + bool operator < ( const RDM_Uid & v ) const + { + for ( uint8_t i = 0; i < 6; i++ ) + if ( m_id[i] != v.m_id[i] ) + return ( m_id[i] < v.m_id[i] ); + } + + bool operator > ( const RDM_Uid & v ) + { + for ( uint8_t i = 0; i < 6; i++ ) + if ( m_id[i] != v.m_id[i] ) + return ( m_id[i] > v.m_id[i] ); + } + + // + // match_mid = manufacturer id to match + // + bool isBroadcast ( uint8_t match_mid[2] ) + { + // Check for genuine broadcast on device part + for ( uint8_t i = 2; i < 6; i++ ) + if ( m_id[i] != 0xff ) + return false; + + // Broadcast or manufacturer designated broadcast + if ( (m_id[0] == 0xff && m_id[1] == 0xff) || + (m_id[0] == match_mid[0] && m_id[1] == match_mid[1]) ) + return true; + + // No broadcast + return false; + } + + uint8_t m_id[6]; //16bit manufacturer id + 32 bits device id +}; + + +#endif /* RDM_UID_H_ */ diff --git a/DMX_NeoPixels/examples/DMX_Master/.cpb.test.skip b/DMX_NeoPixels/examples/DMX_Master/.cpb.test.skip new file mode 100644 index 000000000..064a28912 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.cpb.test.skip @@ -0,0 +1 @@ +# Skip test for cpb diff --git a/DMX_NeoPixels/examples/DMX_Master/.cpc.test.skip b/DMX_NeoPixels/examples/DMX_Master/.cpc.test.skip new file mode 100644 index 000000000..79763353d --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.cpc.test.skip @@ -0,0 +1 @@ +# Skip test for cpc diff --git a/DMX_NeoPixels/examples/DMX_Master/.cpx_ada.test.skip b/DMX_NeoPixels/examples/DMX_Master/.cpx_ada.test.skip new file mode 100644 index 000000000..d9c56cc11 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.cpx_ada.test.skip @@ -0,0 +1 @@ +# Skip test for cpx_ada diff --git a/DMX_NeoPixels/examples/DMX_Master/.esp32.test.skip b/DMX_NeoPixels/examples/DMX_Master/.esp32.test.skip new file mode 100644 index 000000000..5faeb5064 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.esp32.test.skip @@ -0,0 +1 @@ +# Skip test for esp32 diff --git a/DMX_NeoPixels/examples/DMX_Master/.esp8266.test.skip b/DMX_NeoPixels/examples/DMX_Master/.esp8266.test.skip new file mode 100644 index 000000000..15eb13221 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.esp8266.test.skip @@ -0,0 +1 @@ +# Skip test for esp8266 diff --git a/DMX_NeoPixels/examples/DMX_Master/.feather32u4.test.skip b/DMX_NeoPixels/examples/DMX_Master/.feather32u4.test.skip new file mode 100644 index 000000000..eb9fd87a1 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.feather32u4.test.skip @@ -0,0 +1 @@ +# Skip test for feather32u4 diff --git a/DMX_NeoPixels/examples/DMX_Master/.feather_esp32c6.test.skip b/DMX_NeoPixels/examples/DMX_Master/.feather_esp32c6.test.skip new file mode 100644 index 000000000..563448c75 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.feather_esp32c6.test.skip @@ -0,0 +1 @@ +# Skip test for feather_esp32c6 diff --git a/DMX_NeoPixels/examples/DMX_Master/.feather_m0_express.test.skip b/DMX_NeoPixels/examples/DMX_Master/.feather_m0_express.test.skip new file mode 100644 index 000000000..c1118c563 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.feather_m0_express.test.skip @@ -0,0 +1 @@ +# Skip test for feather_m0_express diff --git a/DMX_NeoPixels/examples/DMX_Master/.feather_m4_express.test.skip b/DMX_NeoPixels/examples/DMX_Master/.feather_m4_express.test.skip new file mode 100644 index 000000000..9b961626f --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.feather_m4_express.test.skip @@ -0,0 +1 @@ +# Skip test for feather_m4_express diff --git a/DMX_NeoPixels/examples/DMX_Master/.feather_rp2040.test.skip b/DMX_NeoPixels/examples/DMX_Master/.feather_rp2040.test.skip new file mode 100644 index 000000000..90aa322a7 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.feather_rp2040.test.skip @@ -0,0 +1 @@ +# Skip test for feather_rp2040 diff --git a/DMX_NeoPixels/examples/DMX_Master/.feather_rp2040_adalogger.test.skip b/DMX_NeoPixels/examples/DMX_Master/.feather_rp2040_adalogger.test.skip new file mode 100644 index 000000000..29ebf0ea0 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.feather_rp2040_adalogger.test.skip @@ -0,0 +1 @@ +# Skip test for feather_rp2040_adalogger diff --git a/DMX_NeoPixels/examples/DMX_Master/.flora.test.skip b/DMX_NeoPixels/examples/DMX_Master/.flora.test.skip new file mode 100644 index 000000000..e4cc7386e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.flora.test.skip @@ -0,0 +1 @@ +# Skip test for flora diff --git a/DMX_NeoPixels/examples/DMX_Master/.funhouse.test.skip b/DMX_NeoPixels/examples/DMX_Master/.funhouse.test.skip new file mode 100644 index 000000000..32a4e1e1a --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.funhouse.test.skip @@ -0,0 +1 @@ +# Skip test for funhouse diff --git a/DMX_NeoPixels/examples/DMX_Master/.gemma.test.skip b/DMX_NeoPixels/examples/DMX_Master/.gemma.test.skip new file mode 100644 index 000000000..978f275e3 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.gemma.test.skip @@ -0,0 +1 @@ +# Skip test for gemma diff --git a/DMX_NeoPixels/examples/DMX_Master/.gemma_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master/.gemma_m0.test.skip new file mode 100644 index 000000000..c42614d7c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.gemma_m0.test.skip @@ -0,0 +1 @@ +# Skip test for gemma_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master/.hallowing_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master/.hallowing_m0.test.skip new file mode 100644 index 000000000..ed26fdf6a --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.hallowing_m0.test.skip @@ -0,0 +1 @@ +# Skip test for hallowing_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master/.hallowing_m4_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Master/.hallowing_m4_tinyusb.test.skip new file mode 100644 index 000000000..0ab22cb8d --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.hallowing_m4_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for hallowing_m4_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Master/.ledglasses_nrf52840.test.skip b/DMX_NeoPixels/examples/DMX_Master/.ledglasses_nrf52840.test.skip new file mode 100644 index 000000000..f540a7e4c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.ledglasses_nrf52840.test.skip @@ -0,0 +1 @@ +# Skip test for ledglasses_nrf52840 diff --git a/DMX_NeoPixels/examples/DMX_Master/.magtag.test.skip b/DMX_NeoPixels/examples/DMX_Master/.magtag.test.skip new file mode 100644 index 000000000..79d0d324c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.magtag.test.skip @@ -0,0 +1 @@ +# Skip test for magtag diff --git a/DMX_NeoPixels/examples/DMX_Master/.metro_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master/.metro_m0.test.skip new file mode 100644 index 000000000..91512a898 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.metro_m0.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master/.metro_m0_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Master/.metro_m0_tinyusb.test.skip new file mode 100644 index 000000000..486e4f67e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.metro_m0_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m0_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Master/.metro_m4.test.skip b/DMX_NeoPixels/examples/DMX_Master/.metro_m4.test.skip new file mode 100644 index 000000000..5012f3737 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.metro_m4.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m4 diff --git a/DMX_NeoPixels/examples/DMX_Master/.metro_m4_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Master/.metro_m4_tinyusb.test.skip new file mode 100644 index 000000000..17edc54fe --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.metro_m4_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m4_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Master/.monster_m4sk.test.skip b/DMX_NeoPixels/examples/DMX_Master/.monster_m4sk.test.skip new file mode 100644 index 000000000..ec7f80e48 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.monster_m4sk.test.skip @@ -0,0 +1 @@ +# Skip test for monster_m4sk diff --git a/DMX_NeoPixels/examples/DMX_Master/.monster_m4sk_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Master/.monster_m4sk_tinyusb.test.skip new file mode 100644 index 000000000..a08b60688 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.monster_m4sk_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for monster_m4sk_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Master/.neokeytrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master/.neokeytrinkey_m0.test.skip new file mode 100644 index 000000000..7fb03fe33 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.neokeytrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for neokeytrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master/.neotrellis_m4.test.skip b/DMX_NeoPixels/examples/DMX_Master/.neotrellis_m4.test.skip new file mode 100644 index 000000000..eebfceae8 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.neotrellis_m4.test.skip @@ -0,0 +1 @@ +# Skip test for neotrellis_m4 diff --git a/DMX_NeoPixels/examples/DMX_Master/.nrf52832.test.skip b/DMX_NeoPixels/examples/DMX_Master/.nrf52832.test.skip new file mode 100644 index 000000000..ee506a55a --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.nrf52832.test.skip @@ -0,0 +1 @@ +# Skip test for nrf52832 diff --git a/DMX_NeoPixels/examples/DMX_Master/.nrf52840.test.skip b/DMX_NeoPixels/examples/DMX_Master/.nrf52840.test.skip new file mode 100644 index 000000000..a6bcf2c9d --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.nrf52840.test.skip @@ -0,0 +1 @@ +# Skip test for nrf52840 diff --git a/DMX_NeoPixels/examples/DMX_Master/.pixeltrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master/.pixeltrinkey_m0.test.skip new file mode 100644 index 000000000..4a5f3b346 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.pixeltrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for pixeltrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master/.protrinket_5v.test.skip b/DMX_NeoPixels/examples/DMX_Master/.protrinket_5v.test.skip new file mode 100644 index 000000000..ec91a95cb --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.protrinket_5v.test.skip @@ -0,0 +1 @@ +# Skip test for protrinket_5v diff --git a/DMX_NeoPixels/examples/DMX_Master/.proxlighttrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master/.proxlighttrinkey_m0.test.skip new file mode 100644 index 000000000..0d46213a9 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.proxlighttrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for proxlighttrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master/.pybadge.test.skip b/DMX_NeoPixels/examples/DMX_Master/.pybadge.test.skip new file mode 100644 index 000000000..82cd2ac9c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.pybadge.test.skip @@ -0,0 +1 @@ +# Skip test for pybadge diff --git a/DMX_NeoPixels/examples/DMX_Master/.pycamera_s3.test.skip b/DMX_NeoPixels/examples/DMX_Master/.pycamera_s3.test.skip new file mode 100644 index 000000000..021a63e54 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.pycamera_s3.test.skip @@ -0,0 +1 @@ +# Skip test for pycamera_s3 diff --git a/DMX_NeoPixels/examples/DMX_Master/.pygamer.test.skip b/DMX_NeoPixels/examples/DMX_Master/.pygamer.test.skip new file mode 100644 index 000000000..430cf639c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.pygamer.test.skip @@ -0,0 +1 @@ +# Skip test for pygamer diff --git a/DMX_NeoPixels/examples/DMX_Master/.pyportal.test.skip b/DMX_NeoPixels/examples/DMX_Master/.pyportal.test.skip new file mode 100644 index 000000000..6a18dce9f --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.pyportal.test.skip @@ -0,0 +1 @@ +# Skip test for pyportal diff --git a/DMX_NeoPixels/examples/DMX_Master/.qt2040_trinkey.test.skip b/DMX_NeoPixels/examples/DMX_Master/.qt2040_trinkey.test.skip new file mode 100644 index 000000000..263748866 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.qt2040_trinkey.test.skip @@ -0,0 +1 @@ +# Skip test for qt2040_trinkey diff --git a/DMX_NeoPixels/examples/DMX_Master/.qtpy_esp32s2.test.skip b/DMX_NeoPixels/examples/DMX_Master/.qtpy_esp32s2.test.skip new file mode 100644 index 000000000..627d7dd57 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.qtpy_esp32s2.test.skip @@ -0,0 +1 @@ +# Skip test for qtpy_esp32s2 diff --git a/DMX_NeoPixels/examples/DMX_Master/.qtpy_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master/.qtpy_m0.test.skip new file mode 100644 index 000000000..fbc42f083 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.qtpy_m0.test.skip @@ -0,0 +1 @@ +# Skip test for qtpy_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master/.qualia_s3_rgb666.test.skip b/DMX_NeoPixels/examples/DMX_Master/.qualia_s3_rgb666.test.skip new file mode 100644 index 000000000..1e14eea6e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.qualia_s3_rgb666.test.skip @@ -0,0 +1 @@ +# Skip test for qualia_s3_rgb666 diff --git a/DMX_NeoPixels/examples/DMX_Master/.rotarytrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master/.rotarytrinkey_m0.test.skip new file mode 100644 index 000000000..8a2ec7327 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.rotarytrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for rotarytrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master/.sht4xtrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master/.sht4xtrinkey_m0.test.skip new file mode 100644 index 000000000..039d08b3e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.sht4xtrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for sht4xtrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master/.slidetrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master/.slidetrinkey_m0.test.skip new file mode 100644 index 000000000..d3f14ba82 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.slidetrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for slidetrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master/.trinket_5v.test.skip b/DMX_NeoPixels/examples/DMX_Master/.trinket_5v.test.skip new file mode 100644 index 000000000..e2d3dded0 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.trinket_5v.test.skip @@ -0,0 +1 @@ +# Skip test for trinket_5v diff --git a/DMX_NeoPixels/examples/DMX_Master/.trinket_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master/.trinket_m0.test.skip new file mode 100644 index 000000000..06ad7bf51 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.trinket_m0.test.skip @@ -0,0 +1 @@ +# Skip test for trinket_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master/.uno.test.skip b/DMX_NeoPixels/examples/DMX_Master/.uno.test.skip new file mode 100644 index 000000000..f3e164df1 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/.uno.test.skip @@ -0,0 +1 @@ +# Skip test for uno diff --git a/DMX_NeoPixels/examples/DMX_Master/DMX_Master.ino b/DMX_NeoPixels/examples/DMX_Master/DMX_Master.ino new file mode 100644 index 000000000..e6cf3e9af --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master/DMX_Master.ino @@ -0,0 +1,84 @@ +// SPDX-FileCopyrightText: 2013 W.A. van der Meeren +// +// SPDX-License-Identifier: LGPL-3.0-or-later +/* + DMX_Master.ino - Example code for using the Conceptinetics DMX library + Copyright (c) 2013 W.A. van der Meeren . All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#include + + +// +// CTC-DRA-13-1 ISOLATED DMX-RDM SHIELD JUMPER INSTRUCTIONS +// +// If you are using the above mentioned shield you should +// place the RXEN jumper towards pin number 2, this allows the +// master controller to put to iso shield into transmit +// (DMX Master) mode +// +// +// The !EN Jumper should be either placed in the G (GROUND) +// position to enable the shield circuitry +// OR +// if one of the pins is selected the selected pin should be +// set to OUTPUT mode and set to LOGIC LOW in order for the +// shield to work +// + + +// +// The master will control 100 Channels (1-100) +// +// depending on the ammount of memory you have free you can choose +// to enlarge or schrink the ammount of channels (minimum is 1) +// +#define DMX_MASTER_CHANNELS 100 + +// +// Pin number to change read or write mode on the shield +// +#define RXEN_PIN 2 + + +// Configure a DMX master controller, the master controller +// will use the RXEN_PIN to control its write operation +// on the bus +DMX_Master dmx_master ( DMX_MASTER_CHANNELS, RXEN_PIN ); + + +// the setup routine runs once when you press reset: +void setup() { + + // Enable DMX master interface and start transmitting + dmx_master.enable (); + + // Set channel 1 - 50 @ 50% + dmx_master.setChannelRange ( 1, 25, 127 ); +} + +// the loop routine runs over and over again forever: +void loop() +{ + static int dimmer_val; + + // Keep fading channel 1 in from 0 to 100% + dmx_master.setChannelValue ( 1, dimmer_val++ ); + + delay ( 100 ); +} diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.cpb.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.cpb.test.skip new file mode 100644 index 000000000..064a28912 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.cpb.test.skip @@ -0,0 +1 @@ +# Skip test for cpb diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.cpc.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.cpc.test.skip new file mode 100644 index 000000000..79763353d --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.cpc.test.skip @@ -0,0 +1 @@ +# Skip test for cpc diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.cpx_ada.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.cpx_ada.test.skip new file mode 100644 index 000000000..d9c56cc11 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.cpx_ada.test.skip @@ -0,0 +1 @@ +# Skip test for cpx_ada diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.esp32.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.esp32.test.skip new file mode 100644 index 000000000..5faeb5064 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.esp32.test.skip @@ -0,0 +1 @@ +# Skip test for esp32 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.esp8266.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.esp8266.test.skip new file mode 100644 index 000000000..15eb13221 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.esp8266.test.skip @@ -0,0 +1 @@ +# Skip test for esp8266 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather32u4.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather32u4.test.skip new file mode 100644 index 000000000..eb9fd87a1 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather32u4.test.skip @@ -0,0 +1 @@ +# Skip test for feather32u4 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_esp32c6.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_esp32c6.test.skip new file mode 100644 index 000000000..563448c75 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_esp32c6.test.skip @@ -0,0 +1 @@ +# Skip test for feather_esp32c6 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_m0_express.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_m0_express.test.skip new file mode 100644 index 000000000..c1118c563 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_m0_express.test.skip @@ -0,0 +1 @@ +# Skip test for feather_m0_express diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_m4_express.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_m4_express.test.skip new file mode 100644 index 000000000..9b961626f --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_m4_express.test.skip @@ -0,0 +1 @@ +# Skip test for feather_m4_express diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_rp2040.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_rp2040.test.skip new file mode 100644 index 000000000..90aa322a7 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_rp2040.test.skip @@ -0,0 +1 @@ +# Skip test for feather_rp2040 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_rp2040_adalogger.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_rp2040_adalogger.test.skip new file mode 100644 index 000000000..29ebf0ea0 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.feather_rp2040_adalogger.test.skip @@ -0,0 +1 @@ +# Skip test for feather_rp2040_adalogger diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.flora.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.flora.test.skip new file mode 100644 index 000000000..e4cc7386e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.flora.test.skip @@ -0,0 +1 @@ +# Skip test for flora diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.funhouse.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.funhouse.test.skip new file mode 100644 index 000000000..32a4e1e1a --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.funhouse.test.skip @@ -0,0 +1 @@ +# Skip test for funhouse diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.gemma.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.gemma.test.skip new file mode 100644 index 000000000..978f275e3 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.gemma.test.skip @@ -0,0 +1 @@ +# Skip test for gemma diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.gemma_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.gemma_m0.test.skip new file mode 100644 index 000000000..c42614d7c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.gemma_m0.test.skip @@ -0,0 +1 @@ +# Skip test for gemma_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.hallowing_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.hallowing_m0.test.skip new file mode 100644 index 000000000..ed26fdf6a --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.hallowing_m0.test.skip @@ -0,0 +1 @@ +# Skip test for hallowing_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.hallowing_m4_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.hallowing_m4_tinyusb.test.skip new file mode 100644 index 000000000..0ab22cb8d --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.hallowing_m4_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for hallowing_m4_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.ledglasses_nrf52840.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.ledglasses_nrf52840.test.skip new file mode 100644 index 000000000..f540a7e4c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.ledglasses_nrf52840.test.skip @@ -0,0 +1 @@ +# Skip test for ledglasses_nrf52840 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.magtag.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.magtag.test.skip new file mode 100644 index 000000000..79d0d324c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.magtag.test.skip @@ -0,0 +1 @@ +# Skip test for magtag diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.metro_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.metro_m0.test.skip new file mode 100644 index 000000000..91512a898 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.metro_m0.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.metro_m0_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.metro_m0_tinyusb.test.skip new file mode 100644 index 000000000..486e4f67e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.metro_m0_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m0_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.metro_m4.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.metro_m4.test.skip new file mode 100644 index 000000000..5012f3737 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.metro_m4.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m4 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.metro_m4_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.metro_m4_tinyusb.test.skip new file mode 100644 index 000000000..17edc54fe --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.metro_m4_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m4_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.monster_m4sk.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.monster_m4sk.test.skip new file mode 100644 index 000000000..ec7f80e48 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.monster_m4sk.test.skip @@ -0,0 +1 @@ +# Skip test for monster_m4sk diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.monster_m4sk_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.monster_m4sk_tinyusb.test.skip new file mode 100644 index 000000000..a08b60688 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.monster_m4sk_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for monster_m4sk_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.neokeytrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.neokeytrinkey_m0.test.skip new file mode 100644 index 000000000..7fb03fe33 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.neokeytrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for neokeytrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.neotrellis_m4.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.neotrellis_m4.test.skip new file mode 100644 index 000000000..eebfceae8 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.neotrellis_m4.test.skip @@ -0,0 +1 @@ +# Skip test for neotrellis_m4 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.nrf52832.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.nrf52832.test.skip new file mode 100644 index 000000000..ee506a55a --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.nrf52832.test.skip @@ -0,0 +1 @@ +# Skip test for nrf52832 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.nrf52840.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.nrf52840.test.skip new file mode 100644 index 000000000..a6bcf2c9d --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.nrf52840.test.skip @@ -0,0 +1 @@ +# Skip test for nrf52840 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pixeltrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pixeltrinkey_m0.test.skip new file mode 100644 index 000000000..4a5f3b346 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pixeltrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for pixeltrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.protrinket_5v.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.protrinket_5v.test.skip new file mode 100644 index 000000000..ec91a95cb --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.protrinket_5v.test.skip @@ -0,0 +1 @@ +# Skip test for protrinket_5v diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.proxlighttrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.proxlighttrinkey_m0.test.skip new file mode 100644 index 000000000..0d46213a9 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.proxlighttrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for proxlighttrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pybadge.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pybadge.test.skip new file mode 100644 index 000000000..82cd2ac9c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pybadge.test.skip @@ -0,0 +1 @@ +# Skip test for pybadge diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pycamera_s3.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pycamera_s3.test.skip new file mode 100644 index 000000000..021a63e54 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pycamera_s3.test.skip @@ -0,0 +1 @@ +# Skip test for pycamera_s3 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pygamer.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pygamer.test.skip new file mode 100644 index 000000000..430cf639c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pygamer.test.skip @@ -0,0 +1 @@ +# Skip test for pygamer diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pyportal.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pyportal.test.skip new file mode 100644 index 000000000..6a18dce9f --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.pyportal.test.skip @@ -0,0 +1 @@ +# Skip test for pyportal diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.qt2040_trinkey.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.qt2040_trinkey.test.skip new file mode 100644 index 000000000..263748866 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.qt2040_trinkey.test.skip @@ -0,0 +1 @@ +# Skip test for qt2040_trinkey diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.qtpy_esp32s2.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.qtpy_esp32s2.test.skip new file mode 100644 index 000000000..627d7dd57 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.qtpy_esp32s2.test.skip @@ -0,0 +1 @@ +# Skip test for qtpy_esp32s2 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.qtpy_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.qtpy_m0.test.skip new file mode 100644 index 000000000..fbc42f083 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.qtpy_m0.test.skip @@ -0,0 +1 @@ +# Skip test for qtpy_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.qualia_s3_rgb666.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.qualia_s3_rgb666.test.skip new file mode 100644 index 000000000..1e14eea6e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.qualia_s3_rgb666.test.skip @@ -0,0 +1 @@ +# Skip test for qualia_s3_rgb666 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.rotarytrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.rotarytrinkey_m0.test.skip new file mode 100644 index 000000000..8a2ec7327 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.rotarytrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for rotarytrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.sht4xtrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.sht4xtrinkey_m0.test.skip new file mode 100644 index 000000000..039d08b3e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.sht4xtrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for sht4xtrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.slidetrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.slidetrinkey_m0.test.skip new file mode 100644 index 000000000..d3f14ba82 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.slidetrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for slidetrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.trinket_5v.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.trinket_5v.test.skip new file mode 100644 index 000000000..e2d3dded0 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.trinket_5v.test.skip @@ -0,0 +1 @@ +# Skip test for trinket_5v diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.trinket_m0.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.trinket_m0.test.skip new file mode 100644 index 000000000..06ad7bf51 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.trinket_m0.test.skip @@ -0,0 +1 @@ +# Skip test for trinket_m0 diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.uno.test.skip b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.uno.test.skip new file mode 100644 index 000000000..f3e164df1 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/.uno.test.skip @@ -0,0 +1 @@ +# Skip test for uno diff --git a/DMX_NeoPixels/examples/DMX_Master_Manual_Break/DMX_Master_Manual_Break.ino b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/DMX_Master_Manual_Break.ino new file mode 100644 index 000000000..6d80a78a3 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Master_Manual_Break/DMX_Master_Manual_Break.ino @@ -0,0 +1,114 @@ +// SPDX-FileCopyrightText: 2013 W.A. van der Meeren +// +// SPDX-License-Identifier: LGPL-3.0-or-later +/* + DMX_Master.ino - Example code for using the Conceptinetics DMX library + Copyright (c) 2013 W.A. van der Meeren . All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#include + +// +// When configuring a DMX_Master it will normally automaticly +// generate breaks and continues sending the next frame. +// However, if you would like to have more control over the +// break period and when it to happen then this example is meant for you + + +// +// CTC-DRA-13-1 ISOLATED DMX-RDM SHIELD JUMPER INSTRUCTIONS +// +// If you are using the above mentioned shield you should +// place the RXEN jumper towards pin number 2, this allows the +// master controller to put to iso shield into transmit +// (DMX Master) mode +// +// +// The !EN Jumper should be either placed in the G (GROUND) +// position to enable the shield circuitry +// OR +// if one of the pins is selected the selected pin should be +// set to OUTPUT mode and set to LOGIC LOW in order for the +// shield to work +// + + +// +// The master will control 100 Channels (1-100) +// +// depending on the ammount of memory you have free you can choose +// to enlarge or schrink the ammount of channels (minimum is 1) +// +#define DMX_MASTER_CHANNELS 100 + +// +// Pin number to change read or write mode on the shield +// +#define RXEN_PIN 2 + + +// Configure a DMX master controller, the master controller +// will use the RXEN_PIN to control its write operation +// on the bus +DMX_Master dmx_master ( DMX_MASTER_CHANNELS, RXEN_PIN ); + +const int break_usec = 200; + +// the setup routine runs once when you press reset: +void setup() { + + // Enable DMX master interface and start transmitting + dmx_master.enable (); + + // This will turn the DMX Master into manual break mode + // After doing this you have to check wheter a break is + // expected and then invoke a Break to continue the next + // frame to be sent. + dmx_master.setManualBreakMode (); + + // Set channel 1 - 50 @ 50% + dmx_master.setChannelRange ( 2, 25, 127 ); + + pinMode (13, OUTPUT); +} + +// the loop routine runs over and over again forever: +void loop() +{ + // Check if the DMX master is waiting for a break + // to happen + if ( dmx_master.waitingBreak () ) + { + // We rate limit the number of frames by creating + // a 50msec gap between frames, this is merely done + // as an example to demonstrate the breakAndContinue() + delay ( 50 ); + + // Invoke the breakAndContinue to start generating + // the break and then automaticly continue sending the + // next frame. + // Your application will block for a period + // length of a break and mark after break + dmx_master.breakAndContinue ( break_usec ); + } + + // TODO: Do your other operations part of your + // program here... + + +} diff --git a/DMX_NeoPixels/examples/DMX_Slave/.cpb.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.cpb.test.skip new file mode 100644 index 000000000..064a28912 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.cpb.test.skip @@ -0,0 +1 @@ +# Skip test for cpb diff --git a/DMX_NeoPixels/examples/DMX_Slave/.cpc.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.cpc.test.skip new file mode 100644 index 000000000..79763353d --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.cpc.test.skip @@ -0,0 +1 @@ +# Skip test for cpc diff --git a/DMX_NeoPixels/examples/DMX_Slave/.cpx_ada.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.cpx_ada.test.skip new file mode 100644 index 000000000..d9c56cc11 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.cpx_ada.test.skip @@ -0,0 +1 @@ +# Skip test for cpx_ada diff --git a/DMX_NeoPixels/examples/DMX_Slave/.esp32.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.esp32.test.skip new file mode 100644 index 000000000..5faeb5064 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.esp32.test.skip @@ -0,0 +1 @@ +# Skip test for esp32 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.esp8266.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.esp8266.test.skip new file mode 100644 index 000000000..15eb13221 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.esp8266.test.skip @@ -0,0 +1 @@ +# Skip test for esp8266 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.feather32u4.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.feather32u4.test.skip new file mode 100644 index 000000000..eb9fd87a1 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.feather32u4.test.skip @@ -0,0 +1 @@ +# Skip test for feather32u4 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.feather_esp32c6.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.feather_esp32c6.test.skip new file mode 100644 index 000000000..563448c75 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.feather_esp32c6.test.skip @@ -0,0 +1 @@ +# Skip test for feather_esp32c6 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.feather_m0_express.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.feather_m0_express.test.skip new file mode 100644 index 000000000..c1118c563 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.feather_m0_express.test.skip @@ -0,0 +1 @@ +# Skip test for feather_m0_express diff --git a/DMX_NeoPixels/examples/DMX_Slave/.feather_m4_express.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.feather_m4_express.test.skip new file mode 100644 index 000000000..9b961626f --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.feather_m4_express.test.skip @@ -0,0 +1 @@ +# Skip test for feather_m4_express diff --git a/DMX_NeoPixels/examples/DMX_Slave/.feather_rp2040.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.feather_rp2040.test.skip new file mode 100644 index 000000000..90aa322a7 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.feather_rp2040.test.skip @@ -0,0 +1 @@ +# Skip test for feather_rp2040 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.feather_rp2040_adalogger.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.feather_rp2040_adalogger.test.skip new file mode 100644 index 000000000..29ebf0ea0 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.feather_rp2040_adalogger.test.skip @@ -0,0 +1 @@ +# Skip test for feather_rp2040_adalogger diff --git a/DMX_NeoPixels/examples/DMX_Slave/.flora.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.flora.test.skip new file mode 100644 index 000000000..e4cc7386e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.flora.test.skip @@ -0,0 +1 @@ +# Skip test for flora diff --git a/DMX_NeoPixels/examples/DMX_Slave/.funhouse.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.funhouse.test.skip new file mode 100644 index 000000000..32a4e1e1a --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.funhouse.test.skip @@ -0,0 +1 @@ +# Skip test for funhouse diff --git a/DMX_NeoPixels/examples/DMX_Slave/.gemma.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.gemma.test.skip new file mode 100644 index 000000000..978f275e3 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.gemma.test.skip @@ -0,0 +1 @@ +# Skip test for gemma diff --git a/DMX_NeoPixels/examples/DMX_Slave/.gemma_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.gemma_m0.test.skip new file mode 100644 index 000000000..c42614d7c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.gemma_m0.test.skip @@ -0,0 +1 @@ +# Skip test for gemma_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.hallowing_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.hallowing_m0.test.skip new file mode 100644 index 000000000..ed26fdf6a --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.hallowing_m0.test.skip @@ -0,0 +1 @@ +# Skip test for hallowing_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.hallowing_m4_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.hallowing_m4_tinyusb.test.skip new file mode 100644 index 000000000..0ab22cb8d --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.hallowing_m4_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for hallowing_m4_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Slave/.ledglasses_nrf52840.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.ledglasses_nrf52840.test.skip new file mode 100644 index 000000000..f540a7e4c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.ledglasses_nrf52840.test.skip @@ -0,0 +1 @@ +# Skip test for ledglasses_nrf52840 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.magtag.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.magtag.test.skip new file mode 100644 index 000000000..79d0d324c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.magtag.test.skip @@ -0,0 +1 @@ +# Skip test for magtag diff --git a/DMX_NeoPixels/examples/DMX_Slave/.metro_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.metro_m0.test.skip new file mode 100644 index 000000000..91512a898 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.metro_m0.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.metro_m0_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.metro_m0_tinyusb.test.skip new file mode 100644 index 000000000..486e4f67e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.metro_m0_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m0_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Slave/.metro_m4.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.metro_m4.test.skip new file mode 100644 index 000000000..5012f3737 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.metro_m4.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m4 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.metro_m4_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.metro_m4_tinyusb.test.skip new file mode 100644 index 000000000..17edc54fe --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.metro_m4_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m4_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Slave/.monster_m4sk.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.monster_m4sk.test.skip new file mode 100644 index 000000000..ec7f80e48 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.monster_m4sk.test.skip @@ -0,0 +1 @@ +# Skip test for monster_m4sk diff --git a/DMX_NeoPixels/examples/DMX_Slave/.monster_m4sk_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.monster_m4sk_tinyusb.test.skip new file mode 100644 index 000000000..a08b60688 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.monster_m4sk_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for monster_m4sk_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Slave/.neokeytrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.neokeytrinkey_m0.test.skip new file mode 100644 index 000000000..7fb03fe33 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.neokeytrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for neokeytrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.neotrellis_m4.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.neotrellis_m4.test.skip new file mode 100644 index 000000000..eebfceae8 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.neotrellis_m4.test.skip @@ -0,0 +1 @@ +# Skip test for neotrellis_m4 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.nrf52832.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.nrf52832.test.skip new file mode 100644 index 000000000..ee506a55a --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.nrf52832.test.skip @@ -0,0 +1 @@ +# Skip test for nrf52832 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.nrf52840.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.nrf52840.test.skip new file mode 100644 index 000000000..a6bcf2c9d --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.nrf52840.test.skip @@ -0,0 +1 @@ +# Skip test for nrf52840 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.pixeltrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.pixeltrinkey_m0.test.skip new file mode 100644 index 000000000..4a5f3b346 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.pixeltrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for pixeltrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.protrinket_5v.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.protrinket_5v.test.skip new file mode 100644 index 000000000..ec91a95cb --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.protrinket_5v.test.skip @@ -0,0 +1 @@ +# Skip test for protrinket_5v diff --git a/DMX_NeoPixels/examples/DMX_Slave/.proxlighttrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.proxlighttrinkey_m0.test.skip new file mode 100644 index 000000000..0d46213a9 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.proxlighttrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for proxlighttrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.pybadge.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.pybadge.test.skip new file mode 100644 index 000000000..82cd2ac9c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.pybadge.test.skip @@ -0,0 +1 @@ +# Skip test for pybadge diff --git a/DMX_NeoPixels/examples/DMX_Slave/.pycamera_s3.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.pycamera_s3.test.skip new file mode 100644 index 000000000..021a63e54 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.pycamera_s3.test.skip @@ -0,0 +1 @@ +# Skip test for pycamera_s3 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.pygamer.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.pygamer.test.skip new file mode 100644 index 000000000..430cf639c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.pygamer.test.skip @@ -0,0 +1 @@ +# Skip test for pygamer diff --git a/DMX_NeoPixels/examples/DMX_Slave/.pyportal.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.pyportal.test.skip new file mode 100644 index 000000000..6a18dce9f --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.pyportal.test.skip @@ -0,0 +1 @@ +# Skip test for pyportal diff --git a/DMX_NeoPixels/examples/DMX_Slave/.qt2040_trinkey.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.qt2040_trinkey.test.skip new file mode 100644 index 000000000..263748866 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.qt2040_trinkey.test.skip @@ -0,0 +1 @@ +# Skip test for qt2040_trinkey diff --git a/DMX_NeoPixels/examples/DMX_Slave/.qtpy_esp32s2.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.qtpy_esp32s2.test.skip new file mode 100644 index 000000000..627d7dd57 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.qtpy_esp32s2.test.skip @@ -0,0 +1 @@ +# Skip test for qtpy_esp32s2 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.qtpy_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.qtpy_m0.test.skip new file mode 100644 index 000000000..fbc42f083 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.qtpy_m0.test.skip @@ -0,0 +1 @@ +# Skip test for qtpy_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.qualia_s3_rgb666.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.qualia_s3_rgb666.test.skip new file mode 100644 index 000000000..1e14eea6e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.qualia_s3_rgb666.test.skip @@ -0,0 +1 @@ +# Skip test for qualia_s3_rgb666 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.rotarytrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.rotarytrinkey_m0.test.skip new file mode 100644 index 000000000..8a2ec7327 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.rotarytrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for rotarytrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.sht4xtrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.sht4xtrinkey_m0.test.skip new file mode 100644 index 000000000..039d08b3e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.sht4xtrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for sht4xtrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.slidetrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.slidetrinkey_m0.test.skip new file mode 100644 index 000000000..d3f14ba82 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.slidetrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for slidetrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.trinket_5v.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.trinket_5v.test.skip new file mode 100644 index 000000000..e2d3dded0 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.trinket_5v.test.skip @@ -0,0 +1 @@ +# Skip test for trinket_5v diff --git a/DMX_NeoPixels/examples/DMX_Slave/.trinket_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.trinket_m0.test.skip new file mode 100644 index 000000000..06ad7bf51 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.trinket_m0.test.skip @@ -0,0 +1 @@ +# Skip test for trinket_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave/.uno.test.skip b/DMX_NeoPixels/examples/DMX_Slave/.uno.test.skip new file mode 100644 index 000000000..f3e164df1 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/.uno.test.skip @@ -0,0 +1 @@ +# Skip test for uno diff --git a/DMX_NeoPixels/examples/DMX_Slave/DMX_Slave.ino b/DMX_NeoPixels/examples/DMX_Slave/DMX_Slave.ino new file mode 100644 index 000000000..1e4fc2f21 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave/DMX_Slave.ino @@ -0,0 +1,103 @@ +// SPDX-FileCopyrightText: 2013 W.A. van der Meeren +// +// SPDX-License-Identifier: LGPL-3.0-or-later +/* + DMX_Slave.ino - Example code for using the Conceptinetics DMX library + Copyright (c) 2013 W.A. van der Meeren . All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#include + +// +// CTC-DRA-13-1 ISOLATED DMX-RDM SHIELD JUMPER INSTRUCTIONS +// +// If you are using the above mentioned shield you should +// place the RXEN jumper towards G (Ground), This will turn +// the shield into read mode without using up an IO pin +// +// The !EN Jumper should be either placed in the G (GROUND) +// position to enable the shield circuitry +// OR +// if one of the pins is selected the selected pin should be +// set to OUTPUT mode and set to LOGIC LOW in order for the +// shield to work +// + +// +// The slave device will use a block of 10 channels counting from +// its start address. +// +// If the start address is for example 56, then the channels kept +// by the dmx_slave object is channel 56-66 +// +#define DMX_SLAVE_CHANNELS 10 + +// +// Pin number to change read or write mode on the shield +// Uncomment the following line if you choose to control +// read and write via a pin +// +// On the CTC-DRA-13-1 shield this will always be pin 2, +// if you are using other shields you should look it up +// yourself +// +///// #define RXEN_PIN 2 + + +// Configure a DMX slave controller +DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS ); + +// If you are using an IO pin to control the shields RXEN +// the use the following line instead +///// DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS , RXEN_PIN ); + +const int ledPin = 13; + +// the setup routine runs once when you press reset: +void setup() { + + // Enable DMX slave interface and start recording + // DMX data + dmx_slave.enable (); + + // Set start address to 1, this is also the default setting + // You can change this address at any time during the program + dmx_slave.setStartAddress (1); + + // Set led pin as output pin + pinMode ( ledPin, OUTPUT ); +} + +// the loop routine runs over and over again forever: +void loop() +{ + // + // EXAMPLE DESCRIPTION + // + // If the first channel comes above 50% the led will switch on + // and below 50% the led will be turned off + + // NOTE: + // getChannelValue is relative to the configured startaddress + if ( dmx_slave.getChannelValue (1) > 127 ) + digitalWrite ( ledPin, HIGH ); + else + digitalWrite ( ledPin, LOW ); + + +} diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.cpb.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.cpb.test.skip new file mode 100644 index 000000000..064a28912 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.cpb.test.skip @@ -0,0 +1 @@ +# Skip test for cpb diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.cpc.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.cpc.test.skip new file mode 100644 index 000000000..79763353d --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.cpc.test.skip @@ -0,0 +1 @@ +# Skip test for cpc diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.cpx_ada.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.cpx_ada.test.skip new file mode 100644 index 000000000..d9c56cc11 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.cpx_ada.test.skip @@ -0,0 +1 @@ +# Skip test for cpx_ada diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.esp32.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.esp32.test.skip new file mode 100644 index 000000000..5faeb5064 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.esp32.test.skip @@ -0,0 +1 @@ +# Skip test for esp32 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.esp8266.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.esp8266.test.skip new file mode 100644 index 000000000..15eb13221 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.esp8266.test.skip @@ -0,0 +1 @@ +# Skip test for esp8266 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather32u4.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather32u4.test.skip new file mode 100644 index 000000000..eb9fd87a1 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather32u4.test.skip @@ -0,0 +1 @@ +# Skip test for feather32u4 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_esp32c6.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_esp32c6.test.skip new file mode 100644 index 000000000..563448c75 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_esp32c6.test.skip @@ -0,0 +1 @@ +# Skip test for feather_esp32c6 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_m0_express.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_m0_express.test.skip new file mode 100644 index 000000000..c1118c563 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_m0_express.test.skip @@ -0,0 +1 @@ +# Skip test for feather_m0_express diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_m4_express.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_m4_express.test.skip new file mode 100644 index 000000000..9b961626f --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_m4_express.test.skip @@ -0,0 +1 @@ +# Skip test for feather_m4_express diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_rp2040.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_rp2040.test.skip new file mode 100644 index 000000000..90aa322a7 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_rp2040.test.skip @@ -0,0 +1 @@ +# Skip test for feather_rp2040 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_rp2040_adalogger.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_rp2040_adalogger.test.skip new file mode 100644 index 000000000..29ebf0ea0 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.feather_rp2040_adalogger.test.skip @@ -0,0 +1 @@ +# Skip test for feather_rp2040_adalogger diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.flora.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.flora.test.skip new file mode 100644 index 000000000..e4cc7386e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.flora.test.skip @@ -0,0 +1 @@ +# Skip test for flora diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.funhouse.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.funhouse.test.skip new file mode 100644 index 000000000..32a4e1e1a --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.funhouse.test.skip @@ -0,0 +1 @@ +# Skip test for funhouse diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.gemma.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.gemma.test.skip new file mode 100644 index 000000000..978f275e3 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.gemma.test.skip @@ -0,0 +1 @@ +# Skip test for gemma diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.gemma_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.gemma_m0.test.skip new file mode 100644 index 000000000..c42614d7c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.gemma_m0.test.skip @@ -0,0 +1 @@ +# Skip test for gemma_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.hallowing_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.hallowing_m0.test.skip new file mode 100644 index 000000000..ed26fdf6a --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.hallowing_m0.test.skip @@ -0,0 +1 @@ +# Skip test for hallowing_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.hallowing_m4_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.hallowing_m4_tinyusb.test.skip new file mode 100644 index 000000000..0ab22cb8d --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.hallowing_m4_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for hallowing_m4_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.ledglasses_nrf52840.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.ledglasses_nrf52840.test.skip new file mode 100644 index 000000000..f540a7e4c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.ledglasses_nrf52840.test.skip @@ -0,0 +1 @@ +# Skip test for ledglasses_nrf52840 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.magtag.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.magtag.test.skip new file mode 100644 index 000000000..79d0d324c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.magtag.test.skip @@ -0,0 +1 @@ +# Skip test for magtag diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.metro_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.metro_m0.test.skip new file mode 100644 index 000000000..91512a898 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.metro_m0.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.metro_m0_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.metro_m0_tinyusb.test.skip new file mode 100644 index 000000000..486e4f67e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.metro_m0_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m0_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.metro_m4.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.metro_m4.test.skip new file mode 100644 index 000000000..5012f3737 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.metro_m4.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m4 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.metro_m4_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.metro_m4_tinyusb.test.skip new file mode 100644 index 000000000..17edc54fe --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.metro_m4_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m4_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.monster_m4sk.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.monster_m4sk.test.skip new file mode 100644 index 000000000..ec7f80e48 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.monster_m4sk.test.skip @@ -0,0 +1 @@ +# Skip test for monster_m4sk diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.monster_m4sk_tinyusb.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.monster_m4sk_tinyusb.test.skip new file mode 100644 index 000000000..a08b60688 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.monster_m4sk_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for monster_m4sk_tinyusb diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.neokeytrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.neokeytrinkey_m0.test.skip new file mode 100644 index 000000000..7fb03fe33 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.neokeytrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for neokeytrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.neotrellis_m4.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.neotrellis_m4.test.skip new file mode 100644 index 000000000..eebfceae8 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.neotrellis_m4.test.skip @@ -0,0 +1 @@ +# Skip test for neotrellis_m4 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.nrf52832.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.nrf52832.test.skip new file mode 100644 index 000000000..ee506a55a --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.nrf52832.test.skip @@ -0,0 +1 @@ +# Skip test for nrf52832 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.nrf52840.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.nrf52840.test.skip new file mode 100644 index 000000000..a6bcf2c9d --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.nrf52840.test.skip @@ -0,0 +1 @@ +# Skip test for nrf52840 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pixeltrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pixeltrinkey_m0.test.skip new file mode 100644 index 000000000..4a5f3b346 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pixeltrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for pixeltrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.protrinket_5v.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.protrinket_5v.test.skip new file mode 100644 index 000000000..ec91a95cb --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.protrinket_5v.test.skip @@ -0,0 +1 @@ +# Skip test for protrinket_5v diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.proxlighttrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.proxlighttrinkey_m0.test.skip new file mode 100644 index 000000000..0d46213a9 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.proxlighttrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for proxlighttrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pybadge.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pybadge.test.skip new file mode 100644 index 000000000..82cd2ac9c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pybadge.test.skip @@ -0,0 +1 @@ +# Skip test for pybadge diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pycamera_s3.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pycamera_s3.test.skip new file mode 100644 index 000000000..021a63e54 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pycamera_s3.test.skip @@ -0,0 +1 @@ +# Skip test for pycamera_s3 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pygamer.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pygamer.test.skip new file mode 100644 index 000000000..430cf639c --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pygamer.test.skip @@ -0,0 +1 @@ +# Skip test for pygamer diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pyportal.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pyportal.test.skip new file mode 100644 index 000000000..6a18dce9f --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.pyportal.test.skip @@ -0,0 +1 @@ +# Skip test for pyportal diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.qt2040_trinkey.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.qt2040_trinkey.test.skip new file mode 100644 index 000000000..263748866 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.qt2040_trinkey.test.skip @@ -0,0 +1 @@ +# Skip test for qt2040_trinkey diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.qtpy_esp32s2.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.qtpy_esp32s2.test.skip new file mode 100644 index 000000000..627d7dd57 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.qtpy_esp32s2.test.skip @@ -0,0 +1 @@ +# Skip test for qtpy_esp32s2 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.qtpy_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.qtpy_m0.test.skip new file mode 100644 index 000000000..fbc42f083 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.qtpy_m0.test.skip @@ -0,0 +1 @@ +# Skip test for qtpy_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.qualia_s3_rgb666.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.qualia_s3_rgb666.test.skip new file mode 100644 index 000000000..1e14eea6e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.qualia_s3_rgb666.test.skip @@ -0,0 +1 @@ +# Skip test for qualia_s3_rgb666 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.rotarytrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.rotarytrinkey_m0.test.skip new file mode 100644 index 000000000..8a2ec7327 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.rotarytrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for rotarytrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.sht4xtrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.sht4xtrinkey_m0.test.skip new file mode 100644 index 000000000..039d08b3e --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.sht4xtrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for sht4xtrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.slidetrinkey_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.slidetrinkey_m0.test.skip new file mode 100644 index 000000000..d3f14ba82 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.slidetrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for slidetrinkey_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.trinket_5v.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.trinket_5v.test.skip new file mode 100644 index 000000000..e2d3dded0 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.trinket_5v.test.skip @@ -0,0 +1 @@ +# Skip test for trinket_5v diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.trinket_m0.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.trinket_m0.test.skip new file mode 100644 index 000000000..06ad7bf51 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.trinket_m0.test.skip @@ -0,0 +1 @@ +# Skip test for trinket_m0 diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.uno.test.skip b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.uno.test.skip new file mode 100644 index 000000000..f3e164df1 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/.uno.test.skip @@ -0,0 +1 @@ +# Skip test for uno diff --git a/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/DMX_Slave_Signal_Timeout.ino b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/DMX_Slave_Signal_Timeout.ino new file mode 100644 index 000000000..d36848135 --- /dev/null +++ b/DMX_NeoPixels/examples/DMX_Slave_Signal_Timeout/DMX_Slave_Signal_Timeout.ino @@ -0,0 +1,137 @@ +// SPDX-FileCopyrightText: 2013 W.A. van der Meeren +// +// SPDX-License-Identifier: LGPL-3.0-or-later +/* + DMX_Slave.ino - Example code for using the Conceptinetics DMX library + Copyright (c) 2013 W.A. van der Meeren . All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#include + +// +// CTC-DRA-13-1 ISOLATED DMX-RDM SHIELD JUMPER INSTRUCTIONS +// +// If you are using the above mentioned shield you should +// place the RXEN jumper towards G (Ground), This will turn +// the shield into read mode without using up an IO pin +// +// The !EN Jumper should be either placed in the G (GROUND) +// position to enable the shield circuitry +// OR +// if one of the pins is selected the selected pin should be +// set to OUTPUT mode and set to LOGIC LOW in order for the +// shield to work +// + +// +// The slave device will use a block of 10 channels counting from +// its start address. +// +// If the start address is for example 56, then the channels kept +// by the dmx_slave object is channel 56-66 +// +#define DMX_SLAVE_CHANNELS 10 + +// +// Pin number to change read or write mode on the shield +// Uncomment the following line if you choose to control +// read and write via a pin +// +// On the CTC-DRA-13-1 shield this will always be pin 2, +// if you are using other shields you should look it up +// yourself +// +///// #define RXEN_PIN 2 + + +// Configure a DMX slave controller +DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS ); + +// If you are using an IO pin to control the shields RXEN +// the use the following line instead +///// DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS , RXEN_PIN ); + +const int ledPin = 13; + +unsigned long lastFrameReceivedTime; +const unsigned long dmxTimeoutMillis = 10000UL; + + +// the setup routine runs once when you press reset: +void setup() { + + // Enable DMX slave interface and start recording + // DMX data + dmx_slave.enable (); + + // Set start address to 1, this is also the default setting + // You can change this address at any time during the program + dmx_slave.setStartAddress (1); + + // + // Register on frame complete event to determine signal timeout + // + dmx_slave.onReceiveComplete ( OnFrameReceiveComplete ); + + // Set led pin as output pin + pinMode ( ledPin, OUTPUT ); +} + +// the loop routine runs over and over again forever: +void loop() +{ + // Get current time + unsigned long now = millis(); + + // If we didn't receive a DMX frame within the timeout period + // clear all dmx channels + if ( now - lastFrameReceivedTime > dmxTimeoutMillis ) + dmx_slave.getBuffer().clear(); + + // + // EXAMPLE DESCRIPTION + // + // If the first channel comes above 50% the led will switch on + // and below 50% the led will be turned off + + // NOTE: + // getChannelValue is relative to the configured startaddress + if ( dmx_slave.getChannelValue (1) > 127 ) + digitalWrite ( ledPin, HIGH ); + else + digitalWrite ( ledPin, LOW ); + +} + +void OnFrameReceiveComplete (unsigned short channelsReceived) +{ + if ( channelsReceived == DMX_SLAVE_CHANNELS) + { + // All slave channels have been received + } + else + { + // We have received a frame but not all channels we where + // waiting for, master might have transmitted less + // channels + } + + // Update receive time to determine signal timeout + lastFrameReceivedTime = millis (); +} + diff --git a/DMX_NeoPixels/examples/RDM_Slave/.cpb.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.cpb.test.skip new file mode 100644 index 000000000..064a28912 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.cpb.test.skip @@ -0,0 +1 @@ +# Skip test for cpb diff --git a/DMX_NeoPixels/examples/RDM_Slave/.cpc.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.cpc.test.skip new file mode 100644 index 000000000..79763353d --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.cpc.test.skip @@ -0,0 +1 @@ +# Skip test for cpc diff --git a/DMX_NeoPixels/examples/RDM_Slave/.cpx_ada.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.cpx_ada.test.skip new file mode 100644 index 000000000..d9c56cc11 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.cpx_ada.test.skip @@ -0,0 +1 @@ +# Skip test for cpx_ada diff --git a/DMX_NeoPixels/examples/RDM_Slave/.esp32.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.esp32.test.skip new file mode 100644 index 000000000..5faeb5064 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.esp32.test.skip @@ -0,0 +1 @@ +# Skip test for esp32 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.esp8266.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.esp8266.test.skip new file mode 100644 index 000000000..15eb13221 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.esp8266.test.skip @@ -0,0 +1 @@ +# Skip test for esp8266 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.feather32u4.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.feather32u4.test.skip new file mode 100644 index 000000000..eb9fd87a1 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.feather32u4.test.skip @@ -0,0 +1 @@ +# Skip test for feather32u4 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.feather_esp32c6.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.feather_esp32c6.test.skip new file mode 100644 index 000000000..563448c75 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.feather_esp32c6.test.skip @@ -0,0 +1 @@ +# Skip test for feather_esp32c6 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.feather_m0_express.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.feather_m0_express.test.skip new file mode 100644 index 000000000..c1118c563 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.feather_m0_express.test.skip @@ -0,0 +1 @@ +# Skip test for feather_m0_express diff --git a/DMX_NeoPixels/examples/RDM_Slave/.feather_m4_express.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.feather_m4_express.test.skip new file mode 100644 index 000000000..9b961626f --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.feather_m4_express.test.skip @@ -0,0 +1 @@ +# Skip test for feather_m4_express diff --git a/DMX_NeoPixels/examples/RDM_Slave/.feather_rp2040.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.feather_rp2040.test.skip new file mode 100644 index 000000000..90aa322a7 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.feather_rp2040.test.skip @@ -0,0 +1 @@ +# Skip test for feather_rp2040 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.feather_rp2040_adalogger.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.feather_rp2040_adalogger.test.skip new file mode 100644 index 000000000..29ebf0ea0 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.feather_rp2040_adalogger.test.skip @@ -0,0 +1 @@ +# Skip test for feather_rp2040_adalogger diff --git a/DMX_NeoPixels/examples/RDM_Slave/.flora.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.flora.test.skip new file mode 100644 index 000000000..e4cc7386e --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.flora.test.skip @@ -0,0 +1 @@ +# Skip test for flora diff --git a/DMX_NeoPixels/examples/RDM_Slave/.funhouse.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.funhouse.test.skip new file mode 100644 index 000000000..32a4e1e1a --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.funhouse.test.skip @@ -0,0 +1 @@ +# Skip test for funhouse diff --git a/DMX_NeoPixels/examples/RDM_Slave/.gemma.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.gemma.test.skip new file mode 100644 index 000000000..978f275e3 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.gemma.test.skip @@ -0,0 +1 @@ +# Skip test for gemma diff --git a/DMX_NeoPixels/examples/RDM_Slave/.gemma_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.gemma_m0.test.skip new file mode 100644 index 000000000..c42614d7c --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.gemma_m0.test.skip @@ -0,0 +1 @@ +# Skip test for gemma_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.hallowing_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.hallowing_m0.test.skip new file mode 100644 index 000000000..ed26fdf6a --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.hallowing_m0.test.skip @@ -0,0 +1 @@ +# Skip test for hallowing_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.hallowing_m4_tinyusb.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.hallowing_m4_tinyusb.test.skip new file mode 100644 index 000000000..0ab22cb8d --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.hallowing_m4_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for hallowing_m4_tinyusb diff --git a/DMX_NeoPixels/examples/RDM_Slave/.ledglasses_nrf52840.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.ledglasses_nrf52840.test.skip new file mode 100644 index 000000000..f540a7e4c --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.ledglasses_nrf52840.test.skip @@ -0,0 +1 @@ +# Skip test for ledglasses_nrf52840 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.magtag.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.magtag.test.skip new file mode 100644 index 000000000..79d0d324c --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.magtag.test.skip @@ -0,0 +1 @@ +# Skip test for magtag diff --git a/DMX_NeoPixels/examples/RDM_Slave/.metro_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.metro_m0.test.skip new file mode 100644 index 000000000..91512a898 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.metro_m0.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.metro_m0_tinyusb.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.metro_m0_tinyusb.test.skip new file mode 100644 index 000000000..486e4f67e --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.metro_m0_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m0_tinyusb diff --git a/DMX_NeoPixels/examples/RDM_Slave/.metro_m4.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.metro_m4.test.skip new file mode 100644 index 000000000..5012f3737 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.metro_m4.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m4 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.metro_m4_tinyusb.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.metro_m4_tinyusb.test.skip new file mode 100644 index 000000000..17edc54fe --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.metro_m4_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m4_tinyusb diff --git a/DMX_NeoPixels/examples/RDM_Slave/.monster_m4sk.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.monster_m4sk.test.skip new file mode 100644 index 000000000..ec7f80e48 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.monster_m4sk.test.skip @@ -0,0 +1 @@ +# Skip test for monster_m4sk diff --git a/DMX_NeoPixels/examples/RDM_Slave/.monster_m4sk_tinyusb.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.monster_m4sk_tinyusb.test.skip new file mode 100644 index 000000000..a08b60688 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.monster_m4sk_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for monster_m4sk_tinyusb diff --git a/DMX_NeoPixels/examples/RDM_Slave/.neokeytrinkey_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.neokeytrinkey_m0.test.skip new file mode 100644 index 000000000..7fb03fe33 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.neokeytrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for neokeytrinkey_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.neotrellis_m4.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.neotrellis_m4.test.skip new file mode 100644 index 000000000..eebfceae8 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.neotrellis_m4.test.skip @@ -0,0 +1 @@ +# Skip test for neotrellis_m4 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.nrf52832.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.nrf52832.test.skip new file mode 100644 index 000000000..ee506a55a --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.nrf52832.test.skip @@ -0,0 +1 @@ +# Skip test for nrf52832 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.nrf52840.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.nrf52840.test.skip new file mode 100644 index 000000000..a6bcf2c9d --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.nrf52840.test.skip @@ -0,0 +1 @@ +# Skip test for nrf52840 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.pixeltrinkey_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.pixeltrinkey_m0.test.skip new file mode 100644 index 000000000..4a5f3b346 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.pixeltrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for pixeltrinkey_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.protrinket_5v.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.protrinket_5v.test.skip new file mode 100644 index 000000000..ec91a95cb --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.protrinket_5v.test.skip @@ -0,0 +1 @@ +# Skip test for protrinket_5v diff --git a/DMX_NeoPixels/examples/RDM_Slave/.proxlighttrinkey_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.proxlighttrinkey_m0.test.skip new file mode 100644 index 000000000..0d46213a9 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.proxlighttrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for proxlighttrinkey_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.pybadge.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.pybadge.test.skip new file mode 100644 index 000000000..82cd2ac9c --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.pybadge.test.skip @@ -0,0 +1 @@ +# Skip test for pybadge diff --git a/DMX_NeoPixels/examples/RDM_Slave/.pycamera_s3.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.pycamera_s3.test.skip new file mode 100644 index 000000000..021a63e54 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.pycamera_s3.test.skip @@ -0,0 +1 @@ +# Skip test for pycamera_s3 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.pygamer.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.pygamer.test.skip new file mode 100644 index 000000000..430cf639c --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.pygamer.test.skip @@ -0,0 +1 @@ +# Skip test for pygamer diff --git a/DMX_NeoPixels/examples/RDM_Slave/.pyportal.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.pyportal.test.skip new file mode 100644 index 000000000..6a18dce9f --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.pyportal.test.skip @@ -0,0 +1 @@ +# Skip test for pyportal diff --git a/DMX_NeoPixels/examples/RDM_Slave/.qt2040_trinkey.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.qt2040_trinkey.test.skip new file mode 100644 index 000000000..263748866 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.qt2040_trinkey.test.skip @@ -0,0 +1 @@ +# Skip test for qt2040_trinkey diff --git a/DMX_NeoPixels/examples/RDM_Slave/.qtpy_esp32s2.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.qtpy_esp32s2.test.skip new file mode 100644 index 000000000..627d7dd57 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.qtpy_esp32s2.test.skip @@ -0,0 +1 @@ +# Skip test for qtpy_esp32s2 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.qtpy_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.qtpy_m0.test.skip new file mode 100644 index 000000000..fbc42f083 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.qtpy_m0.test.skip @@ -0,0 +1 @@ +# Skip test for qtpy_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.qualia_s3_rgb666.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.qualia_s3_rgb666.test.skip new file mode 100644 index 000000000..1e14eea6e --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.qualia_s3_rgb666.test.skip @@ -0,0 +1 @@ +# Skip test for qualia_s3_rgb666 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.rotarytrinkey_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.rotarytrinkey_m0.test.skip new file mode 100644 index 000000000..8a2ec7327 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.rotarytrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for rotarytrinkey_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.sht4xtrinkey_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.sht4xtrinkey_m0.test.skip new file mode 100644 index 000000000..039d08b3e --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.sht4xtrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for sht4xtrinkey_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.slidetrinkey_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.slidetrinkey_m0.test.skip new file mode 100644 index 000000000..d3f14ba82 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.slidetrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for slidetrinkey_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.trinket_5v.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.trinket_5v.test.skip new file mode 100644 index 000000000..e2d3dded0 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.trinket_5v.test.skip @@ -0,0 +1 @@ +# Skip test for trinket_5v diff --git a/DMX_NeoPixels/examples/RDM_Slave/.trinket_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.trinket_m0.test.skip new file mode 100644 index 000000000..06ad7bf51 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.trinket_m0.test.skip @@ -0,0 +1 @@ +# Skip test for trinket_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave/.uno.test.skip b/DMX_NeoPixels/examples/RDM_Slave/.uno.test.skip new file mode 100644 index 000000000..f3e164df1 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/.uno.test.skip @@ -0,0 +1 @@ +# Skip test for uno diff --git a/DMX_NeoPixels/examples/RDM_Slave/RDM_Slave.ino b/DMX_NeoPixels/examples/RDM_Slave/RDM_Slave.ino new file mode 100644 index 000000000..a793d2f32 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave/RDM_Slave.ino @@ -0,0 +1,122 @@ +// SPDX-FileCopyrightText: 2013 W.A. van der Meeren +// +// SPDX-License-Identifier: LGPL-3.0-or-later +/* + RDM_Responder.ino - Example code for using the Conceptinetics DMX library + Copyright (c) 2013 W.A. van der Meeren . All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#include + +// +// CTC-DRA-13-1 ISOLATED DMX-RDM SHIELD JUMPER INSTRUCTIONS +// +// RXEN JUMPER: DE 2 " This allows the software to control reads and writes +// +// The !EN Jumper should be either placed in the G (GROUND) +// position to enable the shield circuitry +// OR +// if one of the pins is selected the selected pin should be +// set to OUTPUT mode and set to LOGIC LOW in order for the +// shield to work +// + +// CTC-DRA-10-1 NON ISOLATED DMX-RDM SHIELD JUMPER INSTRUCTIONS +// JUMPER 1: EN " Shield is enabled +// JUMPER 2: DE " Read Write control via Digital 2 +// JUMPER 3: TX-uart " Use UART for transmitting data +// JUMPER 4: RX-uart " Use UART for receiving data + +// +// DMX512FootPrint (Number of slave channels) +// +#define DMX_SLAVE_CHANNELS 10 + + +// +// Pin number to change read or write mode on the shield +// Uncomment the following line if you choose to control +// read and write via a pin +// +// On the CTC-DRA-13-1 and CTC-DRA-10-1 shields this will always be pin 2, +// if you are using other shields you should look it up +// yourself +// +#define RXEN_PIN 2 + + +// Configure a DMX slave controller +DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS, RXEN_PIN ); + +// Setup RDM Responder with out manufacturer id and +// unique device id +// +// Manufacturer ID: 0x0707 +// Device ID: 0x01 0x02 0x03 0x04 +// +RDM_Responder rdm_responder ( 0x0707, 0x1, 0x2, 0x3, 0x4, dmx_slave ); + +// Led pin used for identification of this responder via RDM +const int ledPin = 13; + +// the setup routine runs once when you press reset: +void setup() { + + // Set initial start address, this can be changed remotely via RDM + dmx_slave.setStartAddress (1); + + // Setup device info to propagate + rdm_responder.setDeviceInfo + ( + 0x1, // Device model ID (manufacturers unique model identifier + rdm::CategoryScenicDrive, // We pretend to be a scenic drive controller + 2, // Available personlities + 1 // Current personality + ); + + // Set vendor software version id + rdm_responder.setSoftwareVersionId ( 0x00, 0x01, 0x00, 0x01 ); + + // Register deveice identification event handler + rdm_responder.onIdentifyDevice ( OnIdentifyDevice ); + + // Enable DMX slave interface and start recording (without RDM won't work) + dmx_slave.enable (); + + // Enable RMD responder (without an active DMX_Slave the RDM responder will not work sinde + // it is integrated into the DMX_Slave object) + rdm_responder.enable (); + + + // Set led pin as output pin + pinMode ( ledPin, OUTPUT ); +} + +// the loop routine runs over and over again forever: +void loop() +{ + // Do stuff here +} + + +// Turn led on if identification is turned on, else turn the +// led off +void OnIdentifyDevice (bool identify) +{ + digitalWrite ( ledPin, identify ? HIGH : LOW ); +} diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.cpb.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.cpb.test.skip new file mode 100644 index 000000000..064a28912 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.cpb.test.skip @@ -0,0 +1 @@ +# Skip test for cpb diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.cpc.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.cpc.test.skip new file mode 100644 index 000000000..79763353d --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.cpc.test.skip @@ -0,0 +1 @@ +# Skip test for cpc diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.cpx_ada.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.cpx_ada.test.skip new file mode 100644 index 000000000..d9c56cc11 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.cpx_ada.test.skip @@ -0,0 +1 @@ +# Skip test for cpx_ada diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.esp32.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.esp32.test.skip new file mode 100644 index 000000000..5faeb5064 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.esp32.test.skip @@ -0,0 +1 @@ +# Skip test for esp32 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.esp8266.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.esp8266.test.skip new file mode 100644 index 000000000..15eb13221 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.esp8266.test.skip @@ -0,0 +1 @@ +# Skip test for esp8266 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather32u4.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather32u4.test.skip new file mode 100644 index 000000000..eb9fd87a1 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather32u4.test.skip @@ -0,0 +1 @@ +# Skip test for feather32u4 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_esp32c6.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_esp32c6.test.skip new file mode 100644 index 000000000..563448c75 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_esp32c6.test.skip @@ -0,0 +1 @@ +# Skip test for feather_esp32c6 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_m0_express.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_m0_express.test.skip new file mode 100644 index 000000000..c1118c563 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_m0_express.test.skip @@ -0,0 +1 @@ +# Skip test for feather_m0_express diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_m4_express.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_m4_express.test.skip new file mode 100644 index 000000000..9b961626f --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_m4_express.test.skip @@ -0,0 +1 @@ +# Skip test for feather_m4_express diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_rp2040.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_rp2040.test.skip new file mode 100644 index 000000000..90aa322a7 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_rp2040.test.skip @@ -0,0 +1 @@ +# Skip test for feather_rp2040 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_rp2040_adalogger.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_rp2040_adalogger.test.skip new file mode 100644 index 000000000..29ebf0ea0 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.feather_rp2040_adalogger.test.skip @@ -0,0 +1 @@ +# Skip test for feather_rp2040_adalogger diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.flora.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.flora.test.skip new file mode 100644 index 000000000..e4cc7386e --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.flora.test.skip @@ -0,0 +1 @@ +# Skip test for flora diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.funhouse.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.funhouse.test.skip new file mode 100644 index 000000000..32a4e1e1a --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.funhouse.test.skip @@ -0,0 +1 @@ +# Skip test for funhouse diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.gemma.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.gemma.test.skip new file mode 100644 index 000000000..978f275e3 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.gemma.test.skip @@ -0,0 +1 @@ +# Skip test for gemma diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.gemma_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.gemma_m0.test.skip new file mode 100644 index 000000000..c42614d7c --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.gemma_m0.test.skip @@ -0,0 +1 @@ +# Skip test for gemma_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.hallowing_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.hallowing_m0.test.skip new file mode 100644 index 000000000..ed26fdf6a --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.hallowing_m0.test.skip @@ -0,0 +1 @@ +# Skip test for hallowing_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.hallowing_m4_tinyusb.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.hallowing_m4_tinyusb.test.skip new file mode 100644 index 000000000..0ab22cb8d --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.hallowing_m4_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for hallowing_m4_tinyusb diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.ledglasses_nrf52840.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.ledglasses_nrf52840.test.skip new file mode 100644 index 000000000..f540a7e4c --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.ledglasses_nrf52840.test.skip @@ -0,0 +1 @@ +# Skip test for ledglasses_nrf52840 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.magtag.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.magtag.test.skip new file mode 100644 index 000000000..79d0d324c --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.magtag.test.skip @@ -0,0 +1 @@ +# Skip test for magtag diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.metro_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.metro_m0.test.skip new file mode 100644 index 000000000..91512a898 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.metro_m0.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.metro_m0_tinyusb.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.metro_m0_tinyusb.test.skip new file mode 100644 index 000000000..486e4f67e --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.metro_m0_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m0_tinyusb diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.metro_m4.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.metro_m4.test.skip new file mode 100644 index 000000000..5012f3737 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.metro_m4.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m4 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.metro_m4_tinyusb.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.metro_m4_tinyusb.test.skip new file mode 100644 index 000000000..17edc54fe --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.metro_m4_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for metro_m4_tinyusb diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.monster_m4sk.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.monster_m4sk.test.skip new file mode 100644 index 000000000..ec7f80e48 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.monster_m4sk.test.skip @@ -0,0 +1 @@ +# Skip test for monster_m4sk diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.monster_m4sk_tinyusb.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.monster_m4sk_tinyusb.test.skip new file mode 100644 index 000000000..a08b60688 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.monster_m4sk_tinyusb.test.skip @@ -0,0 +1 @@ +# Skip test for monster_m4sk_tinyusb diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.neokeytrinkey_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.neokeytrinkey_m0.test.skip new file mode 100644 index 000000000..7fb03fe33 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.neokeytrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for neokeytrinkey_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.neotrellis_m4.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.neotrellis_m4.test.skip new file mode 100644 index 000000000..eebfceae8 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.neotrellis_m4.test.skip @@ -0,0 +1 @@ +# Skip test for neotrellis_m4 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.nrf52832.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.nrf52832.test.skip new file mode 100644 index 000000000..ee506a55a --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.nrf52832.test.skip @@ -0,0 +1 @@ +# Skip test for nrf52832 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.nrf52840.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.nrf52840.test.skip new file mode 100644 index 000000000..a6bcf2c9d --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.nrf52840.test.skip @@ -0,0 +1 @@ +# Skip test for nrf52840 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pixeltrinkey_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pixeltrinkey_m0.test.skip new file mode 100644 index 000000000..4a5f3b346 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pixeltrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for pixeltrinkey_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.protrinket_5v.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.protrinket_5v.test.skip new file mode 100644 index 000000000..ec91a95cb --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.protrinket_5v.test.skip @@ -0,0 +1 @@ +# Skip test for protrinket_5v diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.proxlighttrinkey_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.proxlighttrinkey_m0.test.skip new file mode 100644 index 000000000..0d46213a9 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.proxlighttrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for proxlighttrinkey_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pybadge.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pybadge.test.skip new file mode 100644 index 000000000..82cd2ac9c --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pybadge.test.skip @@ -0,0 +1 @@ +# Skip test for pybadge diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pycamera_s3.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pycamera_s3.test.skip new file mode 100644 index 000000000..021a63e54 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pycamera_s3.test.skip @@ -0,0 +1 @@ +# Skip test for pycamera_s3 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pygamer.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pygamer.test.skip new file mode 100644 index 000000000..430cf639c --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pygamer.test.skip @@ -0,0 +1 @@ +# Skip test for pygamer diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pyportal.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pyportal.test.skip new file mode 100644 index 000000000..6a18dce9f --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.pyportal.test.skip @@ -0,0 +1 @@ +# Skip test for pyportal diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.qt2040_trinkey.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.qt2040_trinkey.test.skip new file mode 100644 index 000000000..263748866 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.qt2040_trinkey.test.skip @@ -0,0 +1 @@ +# Skip test for qt2040_trinkey diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.qtpy_esp32s2.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.qtpy_esp32s2.test.skip new file mode 100644 index 000000000..627d7dd57 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.qtpy_esp32s2.test.skip @@ -0,0 +1 @@ +# Skip test for qtpy_esp32s2 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.qtpy_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.qtpy_m0.test.skip new file mode 100644 index 000000000..fbc42f083 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.qtpy_m0.test.skip @@ -0,0 +1 @@ +# Skip test for qtpy_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.qualia_s3_rgb666.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.qualia_s3_rgb666.test.skip new file mode 100644 index 000000000..1e14eea6e --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.qualia_s3_rgb666.test.skip @@ -0,0 +1 @@ +# Skip test for qualia_s3_rgb666 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.rotarytrinkey_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.rotarytrinkey_m0.test.skip new file mode 100644 index 000000000..8a2ec7327 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.rotarytrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for rotarytrinkey_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.sht4xtrinkey_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.sht4xtrinkey_m0.test.skip new file mode 100644 index 000000000..039d08b3e --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.sht4xtrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for sht4xtrinkey_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.slidetrinkey_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.slidetrinkey_m0.test.skip new file mode 100644 index 000000000..d3f14ba82 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.slidetrinkey_m0.test.skip @@ -0,0 +1 @@ +# Skip test for slidetrinkey_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.trinket_5v.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.trinket_5v.test.skip new file mode 100644 index 000000000..e2d3dded0 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.trinket_5v.test.skip @@ -0,0 +1 @@ +# Skip test for trinket_5v diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.trinket_m0.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.trinket_m0.test.skip new file mode 100644 index 000000000..06ad7bf51 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.trinket_m0.test.skip @@ -0,0 +1 @@ +# Skip test for trinket_m0 diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.uno.test.skip b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.uno.test.skip new file mode 100644 index 000000000..f3e164df1 --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/.uno.test.skip @@ -0,0 +1 @@ +# Skip test for uno diff --git a/DMX_NeoPixels/examples/RDM_Slave_Eeprom/RDM_Slave_Eeprom.ino b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/RDM_Slave_Eeprom.ino new file mode 100644 index 000000000..f6aafbf7c --- /dev/null +++ b/DMX_NeoPixels/examples/RDM_Slave_Eeprom/RDM_Slave_Eeprom.ino @@ -0,0 +1,177 @@ +// SPDX-FileCopyrightText: 2013 W.A. van der Meeren +// +// SPDX-License-Identifier: LGPL-3.0-or-later +/* + RDM_Responder.ino - Example code for using the Conceptinetics DMX library + Copyright (c) 2013 W.A. van der Meeren . All right reserved. + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 3 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ + + +#include + +#include + +// +// CTC-DRA-13-1 ISOLATED DMX-RDM SHIELD JUMPER INSTRUCTIONS +// +// RXEN JUMPER: DE 2 " This allows the software to control reads and writes +// +// The !EN Jumper should be either placed in the G (GROUND) +// position to enable the shield circuitry +// OR +// if one of the pins is selected the selected pin should be +// set to OUTPUT mode and set to LOGIC LOW in order for the +// shield to work +// + +// CTC-DRA-10-1 NON ISOLATED DMX-RDM SHIELD JUMPER INSTRUCTIONS +// JUMPER 1: EN " Shield is enabled +// JUMPER 2: DE " Read Write control via Digital 2 +// JUMPER 3: TX-uart " Use UART for transmitting data +// JUMPER 4: RX-uart " Use UART for receiving data + +// +// DMX512FootPrint (Number of slave channels) +// +#define DMX_SLAVE_CHANNELS 10 +#define DMX_NR_PERSONALITIES 2 +#define DMX_DEFAULT_PERSONALITY 1 + + +// +// Pin number to change read or write mode on the shield +// Uncomment the following line if you choose to control +// read and write via a pin +// +// On the CTC-DRA-13-1 and CTC-DRA-10-1 shields this will always be pin 2, +// if you are using other shields you should look it up +// yourself +// +#define RXEN_PIN 2 + + +// Configure a DMX slave controller +DMX_Slave dmx_slave ( DMX_SLAVE_CHANNELS, RXEN_PIN ); + +// Setup RDM Responder with out manufacturer id and +// unique device id +// +// Manufacturer ID: 0x0707 +// Device ID: 0x01 0x02 0x03 0x04 +// +RDM_Responder rdm_responder ( 0x0707, 0x1, 0x2, 0x3, 0x4, dmx_slave ); + +// Led pin used for identification of this responder via RDM +const int ledPin = 13; + +uint8_t EEMEM DmxPersonality_P = DMX_DEFAULT_PERSONALITY; +uint16_t EEMEM DmxStartAddress_P = 1; +char EEMEM DeviceLabel_P [RDM_MAX_DEVICELABEL_LENGTH] = ""; + +// the setup routine runs once when you press reset: +void setup() { + + uint8_t dmx_personality; + uint16_t dmx_startaddress; + char device_label[RDM_MAX_DEVICELABEL_LENGTH]; + + // Read stored information from EEPROM + dmx_personality = eeprom_read_byte ( &DmxPersonality_P ); + dmx_startaddress = eeprom_read_word ( &DmxStartAddress_P ); + eeprom_read_block ( (void*)device_label, (const void*)DeviceLabel_P, RDM_MAX_DEVICELABEL_LENGTH); + + // Arduino does not upload default EEPROM values, lets make sure they are valid + if ( dmx_startaddress > 512 ) dmx_startaddress = 1; + if ( dmx_personality > DMX_NR_PERSONALITIES ) dmx_personality = 1; + + // Set initial start address, this can be changed remotely via RDM + dmx_slave.setStartAddress ( dmx_startaddress ); + + // Setup device info to propagate + rdm_responder.setDeviceInfo + ( + 0x1, // Device model ID (manufacturers unique model identifier + rdm::CategoryFixture, // We pretend to be a scenic drive controller + DMX_NR_PERSONALITIES, // Available personlities + dmx_personality // Current personality + ); + + // Set vendor software version id + rdm_responder.setSoftwareVersionId ( 0x00, 0x01, 0x00, 0x01 ); + + // Register event handlers + rdm_responder.onIdentifyDevice ( OnIdentifyDevice ); + rdm_responder.onDeviceLabelChanged ( OnDeviceLabelChanged ); + rdm_responder.onDMXStartAddressChanged ( OnDMXStartAddressChanged ); + rdm_responder.onDMXPersonalityChanged ( OnDMXPersonalityChanged ); + + // Restore device label from eeprom + rdm_responder.setDeviceLabel ( device_label, RDM_MAX_DEVICELABEL_LENGTH ); + + // Enable DMX slave interface and start recording (without RDM won't work) + dmx_slave.enable (); + + // Enable RMD responder (without an active DMX_Slave the RDM responder will not work sinde + // it is integrated into the DMX_Slave object) + rdm_responder.enable (); + + // Set led pin as output pin + pinMode ( ledPin, OUTPUT ); +} + +// the loop routine runs over and over again forever: +void loop() +{ + + // Do stuff here + + +} + +// +// Turn led on if identification is turned on, else turn the +// led off +void OnIdentifyDevice (bool identify) +{ + digitalWrite ( ledPin, identify ? HIGH : LOW ); +} + +// +// Save device label when changed to eeprom +// +void OnDeviceLabelChanged ( const char* label, uint8_t s ) +{ + if ( s > RDM_MAX_DEVICELABEL_LENGTH) s = RDM_MAX_DEVICELABEL_LENGTH; + eeprom_write_block ( (void*)label, (void*)DeviceLabel_P, RDM_MAX_DEVICELABEL_LENGTH); +} + +// +// Save new DMX address when remotely changed to eeprom +// +void OnDMXStartAddressChanged ( uint16_t address ) +{ + eeprom_write_word ( &DmxStartAddress_P, address ); +} + +// +// Save new personality when changed remotely to eeprom +// +void OnDMXPersonalityChanged ( uint8_t personality ) +{ + eeprom_write_byte ( &DmxPersonality_P, personality ); +} + diff --git a/DMX_NeoPixels/license/gpl-3.0.webarchive b/DMX_NeoPixels/license/gpl-3.0.webarchive new file mode 100644 index 000000000..fdf146fbc --- /dev/null +++ b/DMX_NeoPixels/license/gpl-3.0.webarchive @@ -0,0 +1,676 @@ +bplist00Ñ_WebMainResourceÕ + ^WebResourceURL_WebResourceData_WebResourceMIMEType_WebResourceTextEncodingName_WebResourceFrameName_'http://www.gnu.org/licenses/gpl-3.0.txtO‰ï
                    GNU GENERAL PUBLIC LICENSE
+                       Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+                            Preamble
+
+  The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+  The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works.  By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users.  We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors.  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+  To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights.  Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received.  You must make sure that they, too, receive
+or can get the source code.  And you must show them these terms so they
+know their rights.
+
+  Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+  For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software.  For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+  Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so.  This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software.  The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable.  Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products.  If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+  Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary.  To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+                       TERMS AND CONDITIONS
+
+  0. Definitions.
+
+  "This License" refers to version 3 of the GNU General Public License.
+
+  "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+  "The Program" refers to any copyrightable work licensed under this
+License.  Each licensee is addressed as "you".  "Licensees" and
+"recipients" may be individuals or organizations.
+
+  To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy.  The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+  A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+  To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy.  Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+  To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies.  Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+  An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License.  If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+  1. Source Code.
+
+  The "source code" for a work means the preferred form of the work
+for making modifications to it.  "Object code" means any non-source
+form of a work.
+
+  A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+  The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form.  A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+  The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities.  However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work.  For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+  The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+  The Corresponding Source for a work in source code form is that
+same work.
+
+  2. Basic Permissions.
+
+  All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met.  This License explicitly affirms your unlimited
+permission to run the unmodified Program.  The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work.  This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+  You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force.  You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright.  Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+  Conveying under any other circumstances is permitted solely under
+the conditions stated below.  Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+  3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+  No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+  When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+  4. Conveying Verbatim Copies.
+
+  You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+  You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+  5. Conveying Modified Source Versions.
+
+  You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+    a) The work must carry prominent notices stating that you modified
+    it, and giving a relevant date.
+
+    b) The work must carry prominent notices stating that it is
+    released under this License and any conditions added under section
+    7.  This requirement modifies the requirement in section 4 to
+    "keep intact all notices".
+
+    c) You must license the entire work, as a whole, under this
+    License to anyone who comes into possession of a copy.  This
+    License will therefore apply, along with any applicable section 7
+    additional terms, to the whole of the work, and all its parts,
+    regardless of how they are packaged.  This License gives no
+    permission to license the work in any other way, but it does not
+    invalidate such permission if you have separately received it.
+
+    d) If the work has interactive user interfaces, each must display
+    Appropriate Legal Notices; however, if the Program has interactive
+    interfaces that do not display Appropriate Legal Notices, your
+    work need not make them do so.
+
+  A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit.  Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+  6. Conveying Non-Source Forms.
+
+  You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+    a) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by the
+    Corresponding Source fixed on a durable physical medium
+    customarily used for software interchange.
+
+    b) Convey the object code in, or embodied in, a physical product
+    (including a physical distribution medium), accompanied by a
+    written offer, valid for at least three years and valid for as
+    long as you offer spare parts or customer support for that product
+    model, to give anyone who possesses the object code either (1) a
+    copy of the Corresponding Source for all the software in the
+    product that is covered by this License, on a durable physical
+    medium customarily used for software interchange, for a price no
+    more than your reasonable cost of physically performing this
+    conveying of source, or (2) access to copy the
+    Corresponding Source from a network server at no charge.
+
+    c) Convey individual copies of the object code with a copy of the
+    written offer to provide the Corresponding Source.  This
+    alternative is allowed only occasionally and noncommercially, and
+    only if you received the object code with such an offer, in accord
+    with subsection 6b.
+
+    d) Convey the object code by offering access from a designated
+    place (gratis or for a charge), and offer equivalent access to the
+    Corresponding Source in the same way through the same place at no
+    further charge.  You need not require recipients to copy the
+    Corresponding Source along with the object code.  If the place to
+    copy the object code is a network server, the Corresponding Source
+    may be on a different server (operated by you or a third party)
+    that supports equivalent copying facilities, provided you maintain
+    clear directions next to the object code saying where to find the
+    Corresponding Source.  Regardless of what server hosts the
+    Corresponding Source, you remain obligated to ensure that it is
+    available for as long as needed to satisfy these requirements.
+
+    e) Convey the object code using peer-to-peer transmission, provided
+    you inform other peers where the object code and Corresponding
+    Source of the work are being offered to the general public at no
+    charge under subsection 6d.
+
+  A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+  A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling.  In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage.  For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product.  A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+  "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source.  The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+  If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information.  But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+  The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed.  Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+  Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+  7. Additional Terms.
+
+  "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law.  If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+  When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it.  (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.)  You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+  Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+    a) Disclaiming warranty or limiting liability differently from the
+    terms of sections 15 and 16 of this License; or
+
+    b) Requiring preservation of specified reasonable legal notices or
+    author attributions in that material or in the Appropriate Legal
+    Notices displayed by works containing it; or
+
+    c) Prohibiting misrepresentation of the origin of that material, or
+    requiring that modified versions of such material be marked in
+    reasonable ways as different from the original version; or
+
+    d) Limiting the use for publicity purposes of names of licensors or
+    authors of the material; or
+
+    e) Declining to grant rights under trademark law for use of some
+    trade names, trademarks, or service marks; or
+
+    f) Requiring indemnification of licensors and authors of that
+    material by anyone who conveys the material (or modified versions of
+    it) with contractual assumptions of liability to the recipient, for
+    any liability that these contractual assumptions directly impose on
+    those licensors and authors.
+
+  All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10.  If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term.  If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+  If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+  Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+  8. Termination.
+
+  You may not propagate or modify a covered work except as expressly
+provided under this License.  Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+  However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+  Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+  Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License.  If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+  9. Acceptance Not Required for Having Copies.
+
+  You are not required to accept this License in order to receive or
+run a copy of the Program.  Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance.  However,
+nothing other than this License grants you permission to propagate or
+modify any covered work.  These actions infringe copyright if you do
+not accept this License.  Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+  10. Automatic Licensing of Downstream Recipients.
+
+  Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License.  You are not responsible
+for enforcing compliance by third parties with this License.
+
+  An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations.  If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+  You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License.  For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+  11. Patents.
+
+  A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based.  The
+work thus licensed is called the contributor's "contributor version".
+
+  A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version.  For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+  Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+  In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement).  To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+  If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients.  "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+  If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+  A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License.  You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+  Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+  12. No Surrender of Others' Freedom.
+
+  If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all.  For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+  13. Use with the GNU Affero General Public License.
+
+  Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work.  The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+  14. Revised Versions of this License.
+
+  The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+  Each version is given a distinguishing version number.  If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation.  If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+  If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+  Later license versions may give you additional or different
+permissions.  However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+  15. Disclaimer of Warranty.
+
+  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+  16. Limitation of Liability.
+
+  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+  17. Interpretation of Sections 15 and 16.
+
+  If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+                     END OF TERMS AND CONDITIONS
+
+            How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software: you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+  If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+    <program>  Copyright (C) <year>  <name of author>
+    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+  You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+  The GNU General Public License does not permit incorporating your program
+into proprietary programs.  If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library.  If this is what you want to do, use the GNU Lesser General
+Public License instead of this License.  But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
Ztext/plainUUTF-8P (7I_}”¾Š±Š¼ŠÂ ŠÃ \ No newline at end of file diff --git a/DMX_NeoPixels/license/lgpl-3.0.webarchive b/DMX_NeoPixels/license/lgpl-3.0.webarchive new file mode 100644 index 000000000..bec3664c7 Binary files /dev/null and b/DMX_NeoPixels/license/lgpl-3.0.webarchive differ diff --git a/DMX_NeoPixels/readme.txt b/DMX_NeoPixels/readme.txt new file mode 100644 index 000000000..1b70dfbba --- /dev/null +++ b/DMX_NeoPixels/readme.txt @@ -0,0 +1,42 @@ + +This library has been developed to support the CTC-DRA-13-R2 Isolated DMX-RDM Shield and CTC-DRA-10-1, CTC-DRA-10-R2 Shield on the Arduino platform. +However, the use of this library is not limited to the prior mentioned boards. This library works on the principle of using a RS485 driver to drive a DMX line or act as a receiver ( DMX Slave ) + +If you wish to make additions or find bugs or would like to contribute in any other way then please don't hesitate to contact me via my email address: danny@illogic.nl or use report issues on the Sourceforge project page instead. + + +For information on installing libraries, see: http://arduino.cc/en/Guide/Libraries + + +*** COPYRIGHT STATEMENT *** + +Copyright (c) 2017 W.A. van der Meeren . All right reserved. + +This library is free software; you can redistribute it and/or +modify it under the terms of the GNU Lesser General Public +License as published by the Free Software Foundation; either +version 3 of the License, or (at your option) any later version. + +This library is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Lesser General Public License for more details. + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +CHANGE LOG: + + - 28-Feb-2017: Fixed various RDM timing issues + - 28-Feb-2017: Removed unwanted transmission during line turnaround (RDM) + - 28-Feb-2017: Updated break time to 176us to comply specs + - 11-Oct-2016: Fix in setting range of channels, end channel does get set + now as well to desired value + - 23-Apr-2014: Fix to overide possible incorrect USART setting (rdm-alpha) + - 17-Apr-2014: RDM responder issue solved in rdm-alpha + - 24-jun-2013: Add on receive complete callback to original library as well + - 14-jun-2013: Add on receive complete callback to dmx_slave in rdm-alpha library + - 26-apr-2013: Add basic Remote Device Management support (alpha) + - 14-apr-2013: Fixed startbyte recognition + - 03-apr-2013: Fixed memomry allocation in slave diff --git a/DOOM_Keeb/code.py b/DOOM_Keeb/code.py new file mode 100644 index 000000000..c2e67d3bf --- /dev/null +++ b/DOOM_Keeb/code.py @@ -0,0 +1,52 @@ +# SPDX-FileCopyrightText: 2024 John Park & Tyeth Gundry for Adafruit Industries +# +# SPDX-License-Identifier: MIT +''' +DOOM launch for Windows +'zdoom.exe' for Windows https://zdoom.org/downloads must be in CIRCUITPY/zdoom directory. +extract https://github.com/fragglet/squashware/releases squashware-1.1.zip, rename to 'doom1.wad', +place in same CIRCUITPY/zdoom directory as the .exe. +''' + +import time +import board +from digitalio import DigitalInOut, Direction +import keypad +import neopixel +import usb_hid +from adafruit_hid.keyboard import Keyboard +from adafruit_hid.keyboard_layout_us import KeyboardLayoutUS +from adafruit_hid.keycode import Keycode + +keys = keypad.Keys((board.A1,), value_when_pressed=False, pull=True) # set up NeoKey launch button + +kbd = Keyboard(usb_hid.devices) # create keyboard object +layout = KeyboardLayoutUS(kbd) + +led = DigitalInOut(board.D13) # on-board LED +led.direction = Direction.OUTPUT +led.value = True + +pixel = neopixel.NeoPixel(board.A2, 1, auto_write=False, brightness=1.0) # NeoKey LED +pixel.fill(0x440000) +pixel.show() + +def launch_terminal(): # function for launching local DOOM + kbd.send(Keycode.GUI, Keycode.R) # open run cmd + time.sleep(0.25) + # pylint: disable=line-too-long + layout.write("powershell -c \"& { gwmi win32_logicaldisk -f 'DriveType=2' | % { try { $p = $_.DeviceID + 'zdoom\\zdoom.exe'; if (Test-Path $p) { Start-Process $p; break } } catch {} } }\"") + time.sleep(0.25) + kbd.send(Keycode.ENTER) + time.sleep(2) + +while True: + event = keys.events.get() # check for keypress + if event: + if event.pressed: + pixel.fill(0xff0000) # brighten LED + pixel.show() + launch_terminal() # launch DOOM + if event.released: + pixel.fill(0x440000) # dim LED + pixel.show() diff --git a/Daily_Cheer_Automaton/CircuitPython/code.py b/Daily_Cheer_Automaton/CircuitPython/code.py index 815224ccd..7e547006c 100644 --- a/Daily_Cheer_Automaton/CircuitPython/code.py +++ b/Daily_Cheer_Automaton/CircuitPython/code.py @@ -40,7 +40,7 @@ import busio as io # import bitbangio as io # import adafruit_ds3231 -import adafruit_pcf8523 +from adafruit_pcf8523.pcf8523 import PCF8523 # SD card import sdcardio @@ -115,7 +115,7 @@ i2c = io.I2C(board.SCL, board.SDA) # Change to the appropriate I2C clock & data # Create the RTC instance: # rtc = adafruit_ds3231.DS3231(i2c) -rtc = adafruit_pcf8523.PCF8523(i2c) +rtc = PCF8523(i2c) # Lookup table for names of days (nicer printing). days = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday") diff --git a/Drum_Track_Sequencer/code.py b/Drum_Track_Sequencer/code.py new file mode 100644 index 000000000..ef9530ee2 --- /dev/null +++ b/Drum_Track_Sequencer/code.py @@ -0,0 +1,77 @@ +# SPDX-FileCopyrightText: 2024 John Park for Adafruit Industries +# +# SPDX-License-Identifier: MIT +""" +Drum Track Sequencer + Feather RP2040, Motor FeatherWing, stepper motor, + four reflection sensors, USB MIDI out +""" +import asyncio +import busio +import board +from adafruit_motorkit import MotorKit +from adafruit_motor import stepper +import keypad +import usb_midi + +# Tempo setup +BPM = 100 # user set value +tempo_table = { # motor speed seems non-linear, so we'll use a lookup table + 110: 0.0004, + 100: 0.001, + 90: 0.002, + 80: 0.003, + 75: 0.004, + 65: 0.005, + 60: 0.006, + 50: 0.008 +} +def get_nearest_tempo(given_bpm): + nearest_table_item = min(tempo_table.keys(), key=lambda k: abs(k - given_bpm)) + return tempo_table[nearest_table_item] +motor_pause = get_nearest_tempo(BPM) + +i2c=busio.I2C(board.SCL, board.SDA, frequency=400_000) + +# Motor setup +kit = MotorKit(i2c=i2c) +motor_run=True + +# Sensor setup +optical_pins = (board.D6, board.D9, board.D10, board.D12) +optical_sensors = keypad.Keys(optical_pins, value_when_pressed=False, pull=True) + +# MIDI setup +midi = usb_midi.ports[1] +midi_notes = (36, 37, 38, 39) # typical drum voice notes + +def play_drum(note): + midi_msg_on = bytearray([0x99, note, 120]) # 0x90 noteOn ch1, 0x99 noteOn ch10 + midi_msg_off = bytearray([0x89, note, 0]) + midi.write(midi_msg_on) + midi.write(midi_msg_off) + +async def check_sensors(): + while True: + optical_sensor = optical_sensors.events.get() + if optical_sensor: + if optical_sensor.pressed: + track_num = optical_sensor.key_number + # print("tripped", track_num) + play_drum(midi_notes[track_num]) + await asyncio.sleep(0.008) # don't check sensors constantly or motor speed reduced + +async def run_motor(): + while True: + kit.stepper1.onestep( + direction=stepper.BACKWARD, + style=stepper.DOUBLE + ) + await asyncio.sleep(motor_pause) # motor speed-- smaller numbers are faster + +async def main(): + motor_task = asyncio.create_task(run_motor()) + sensor_task = asyncio.create_task(check_sensors()) + await asyncio.gather(motor_task, sensor_task) + +asyncio.run(main()) diff --git a/Dune_Thumper/code.py b/Dune_Thumper/code.py new file mode 100644 index 000000000..1533d060f --- /dev/null +++ b/Dune_Thumper/code.py @@ -0,0 +1,59 @@ +# SPDX-FileCopyrightText: 2023 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +import audiocore +import audiobusio +import audiomixer +import pwmio +from digitalio import DigitalInOut, Direction +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff +from adafruit_motor import servo +import adafruit_lis3dh + +time.sleep(2) + +# enable external power pin +# provides power to the external components +external_power = DigitalInOut(board.EXTERNAL_POWER) +external_power.direction = Direction.OUTPUT +external_power.value = True + +# i2s playback +wave_file = open("dune_thumper_sfx.wav", "rb") +wave = audiocore.WaveFile(wave_file) +audio = audiobusio.I2SOut(board.I2S_BIT_CLOCK, board.I2S_WORD_SELECT, board.I2S_DATA) +mixer = audiomixer.Mixer(voice_count=1, sample_rate=22050, channel_count=1, + bits_per_sample=16, samples_signed=True) +audio.play(mixer) +mixer.voice[0].play(wave, loop=True) +mixer.voice[0].level = 0 + +# servo control +pwm = pwmio.PWMOut(board.EXTERNAL_SERVO, frequency=10) +prop_servo = servo.ContinuousServo(pwm) +servo_move = False + +i2c = board.I2C() +int1 = DigitalInOut(board.ACCELEROMETER_INTERRUPT) +lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, int1=int1) +lis3dh.range = adafruit_lis3dh.RANGE_2_G + +clock = ticks_ms() +prop_time = 4000 + +while True: + if not servo_move: + mixer.voice[0].level = 0.0 + prop_servo.throttle = 0.0 + else: + prop_servo.throttle = 0.5 + mixer.voice[0].level = 0.5 + if ticks_diff(ticks_ms(), clock) >= prop_time: + servo_move = False + if lis3dh.shake(shake_threshold=20): + servo_move = True + clock = ticks_ms() + clock = ticks_add(clock, prop_time) diff --git a/Dune_Thumper/dune_thumper_sfx.wav b/Dune_Thumper/dune_thumper_sfx.wav new file mode 100644 index 000000000..4c9ad046f Binary files /dev/null and b/Dune_Thumper/dune_thumper_sfx.wav differ diff --git a/EInk_Bonnet_Weather_Station/code.py b/EInk_Bonnet_Weather_Station/code.py index 2d7a6394f..d0da8b3ef 100644 --- a/EInk_Bonnet_Weather_Station/code.py +++ b/EInk_Bonnet_Weather_Station/code.py @@ -15,6 +15,7 @@ import busio import board from adafruit_epd.ssd1675 import Adafruit_SSD1675 from adafruit_epd.ssd1680 import Adafruit_SSD1680 +from adafruit_epd.ssd1680 import Adafruit_SSD1680Z from weather_graphics import Weather_Graphics spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO) @@ -42,9 +43,11 @@ params = {"q": LOCATION, "appid": OPEN_WEATHER_TOKEN} data_source = DATA_SOURCE_URL + "?" + urllib.parse.urlencode(params) # Initialize the Display -display = Adafruit_SSD1680( # Newer eInk Bonnet -# display = Adafruit_SSD1675( # Older eInk Bonnet - 122, 250, spi, cs_pin=ecs, dc_pin=dc, sramcs_pin=None, rst_pin=rst, busy_pin=busy, +display = Adafruit_SSD1680Z( # New Bonnet ssd1680z [GDEY0213B74] +#display = Adafruit_SSD1680( # Old eInk Bonnet ssd1680 +#display = Adafruit_SSD1675( # Older eInk Bonnet ssd1675 +# 122, 250, spi, cs_pin=ecs, dc_pin=dc, sramcs_pin=None, rst_pin=rst, busy_pin=busy, + 120, 250, spi, cs_pin=ecs, dc_pin=dc, sramcs_pin=None, rst_pin=rst, busy_pin=busy, ) display.rotation = 1 diff --git a/EInk_CircuitPython_Quickstart/27_tricolor_eink_shield_text/code.py b/EInk_CircuitPython_Quickstart/27_tricolor_eink_shield_text/code.py index 8f45e237f..673af95aa 100644 --- a/EInk_CircuitPython_Quickstart/27_tricolor_eink_shield_text/code.py +++ b/EInk_CircuitPython_Quickstart/27_tricolor_eink_shield_text/code.py @@ -73,7 +73,7 @@ text_group.append(text_area) # Add this text to the text group g.append(text_group) # Place the display group on the screen -display.show(g) +display.root_group = g # Refresh the display to have everything show on the display # NOTE: Do not refresh eInk displays more often than 180 seconds! diff --git a/ESP32-S2_TFT_AS7341_Color_Detection/code.py b/ESP32-S2_TFT_AS7341_Color_Detection/code.py new file mode 100755 index 000000000..c74af669c --- /dev/null +++ b/ESP32-S2_TFT_AS7341_Color_Detection/code.py @@ -0,0 +1,121 @@ +# SPDX-FileCopyrightText: 2024 Trevor Beaton for Adafruit Industries +# +# SPDX-License-Identifier: MIT +'''This is a program for a color detection project using the AS7341 and Feather ESP32-S2 & S3''' + +import os +import ssl +import time +import wifi +import board +import busio +import socketpool +import adafruit_requests +import adafruit_as7341 +from adafruit_io.adafruit_io import IO_HTTP, AdafruitIO_RequestError + +# WiFi and Adafruit IO setup +aio_username = os.getenv("aio_username") +aio_key = os.getenv("aio_key") +wifi.radio.connect( + os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD") +) +print(f"Connected to {os.getenv('CIRCUITPY_WIFI_SSID')}!") + +# Initialize network pool and Adafruit IO HTTP +pool = socketpool.SocketPool(wifi.radio) +requests = adafruit_requests.Session(pool, ssl.create_default_context()) +io = IO_HTTP(aio_username, aio_key, requests) + +# Set up I2C connection and AS7341 sensor +i2c = busio.I2C(board.SCL, board.SDA) +sensor = adafruit_as7341.AS7341(i2c) + +# Configure the sensor with correct gain setting +sensor.gain = adafruit_as7341.Gain.GAIN_64X +sensor.atime = 100 +sensor.astep = 999 + +# Adafruit IO feed setup +try: + hue_feed = io.get_feed("hue") +except AdafruitIO_RequestError: + hue_feed = io.create_new_feed("hue") + +def spectral_to_rgb(ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8): + # Normalize the channel readings + total = ch1 + ch2 + ch3 + ch4 + ch5 + ch6 + ch7 + ch8 + if total == 0: + total = 1 + ch1 /= total + ch2 /= total + ch3 /= total + ch4 /= total + ch5 /= total + ch6 /= total + ch7 /= total + ch8 /= total + + # Map channels to RGB components + red = ch6 + ch7 + ch8 # Orange, Red, Deep Red + green = ch4 + ch5 # Green, Yellow-Green + blue = ch1 + ch2 + ch3 # Violet, Blue, Blue-Green + + # Normalize RGB components + rgb_total = red + green + blue + if rgb_total == 0: + rgb_total = 1 + red /= rgb_total + green /= rgb_total + blue /= rgb_total + + # Scale to 0-255 range + red = int(min(max(red * 255, 0), 255)) + green = int(min(max(green * 255, 0), 255)) + blue = int(min(max(blue * 255, 0), 255)) + return red, green, blue + +def rgb_to_hue(r: int, g: int, b: int) -> float: + r_norm = r / 255.0 + g_norm = g / 255.0 + b_norm = b / 255.0 + c_max = max(r_norm, g_norm, b_norm) + c_min = min(r_norm, g_norm, b_norm) + delta = c_max - c_min + + if delta == 0: + calculated_hue = 0 + elif c_max == r_norm: + calculated_hue = (60 * ((g_norm - b_norm) / delta) + 360) % 360 + elif c_max == g_norm: + calculated_hue = (60 * ((b_norm - r_norm) / delta) + 120) % 360 + elif c_max == b_norm: + calculated_hue = (60 * ((r_norm - g_norm) / delta) + 240) % 360 + else: + calculated_hue = 0 + return calculated_hue + +# Main loop +while True: + # Read all spectral channels + channel_readings = sensor.all_channels + # Extract individual channel readings + f1 = channel_readings[0] + f2 = channel_readings[1] + f3 = channel_readings[2] + f4 = channel_readings[3] + f5 = channel_readings[4] + f6 = channel_readings[5] + f7 = channel_readings[6] + f8 = channel_readings[7] + + red_value, green_value, blue_value = spectral_to_rgb(f1, f2, f3, f4, f5, f6, f7, f8) + hue_value = round(rgb_to_hue(red_value, green_value, blue_value)) + print(f"Detected Hue: {hue_value}") + + try: + io.send_data(hue_feed["key"], hue_value) + print(f"Sent Hue value {hue_value} to Adafruit IO feed 'hue'") + except AdafruitIO_RequestError as e: + print(f"Error sending data: {e}") + time.sleep(4) diff --git a/ESP32-S2_TFT_Color_Detection/code.py b/ESP32-S2_TFT_Color_Detection/code.py new file mode 100755 index 000000000..d3ca9fae8 --- /dev/null +++ b/ESP32-S2_TFT_Color_Detection/code.py @@ -0,0 +1,80 @@ +# SPDX-FileCopyrightText: 2024 Trevor Beaton for Adafruit Industries +# +# SPDX-License-Identifier: MIT +'''This is a program for a color detection project using the APD-9960 and Feather ESP32-S2 & S3''' + +import os +import ssl +import time +import wifi +import board +import busio +import socketpool +import adafruit_requests +from adafruit_apds9960.apds9960 import APDS9960 +from adafruit_io.adafruit_io import IO_HTTP, AdafruitIO_RequestError + +# WiFi and Adafruit IO setup +aio_username = os.getenv("aio_username") +aio_key = os.getenv("aio_key") + +wifi.radio.connect( + os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD") +) +print(f"Connected to {os.getenv('CIRCUITPY_WIFI_SSID')}!") + +# Initialize network pool and Adafruit IO HTTP +pool = socketpool.SocketPool(wifi.radio) +requests = adafruit_requests.Session(pool, ssl.create_default_context()) +io = IO_HTTP(aio_username, aio_key, requests) + +# Set up I2C connection and APDS9960 sensor +i2c = busio.I2C(board.SCL, board.SDA) +apds = APDS9960(i2c) +apds.enable_proximity = True +apds.enable_color = True + +# Adafruit IO feed setup +try: + hue_feed = io.get_feed("hue") +except AdafruitIO_RequestError: + hue_feed = io.create_new_feed("hue") + + +# Function to convert RGB to Hue +def rgb_to_hue(r: int, g: int, b: int) -> float: + r_norm = r / 255.0 + g_norm = g / 255.0 + b_norm = b / 255.0 + c_max = max(r_norm, g_norm, b_norm) + c_min = min(r_norm, g_norm, b_norm) + delta = c_max - c_min + + if delta == 0: + calculated_hue = 0 + elif c_max == r_norm: + calculated_hue = (60 * ((g_norm - b_norm) / delta) + 360) % 360 + elif c_max == g_norm: + calculated_hue = (60 * ((b_norm - r_norm) / delta) + 120) % 360 + elif c_max == b_norm: + calculated_hue = (60 * ((r_norm - g_norm) / delta) + 240) % 360 + else: + calculated_hue = 0 # Fallback case + + return calculated_hue + + +# Main loop +while True: + color_data = apds.color_data + red_value, green_value, blue_value = color_data[0], color_data[1], color_data[2] + hue_value = round(rgb_to_hue(red_value, green_value, blue_value)) + print(f"Detected Hue: {hue_value}") + + try: + io.send_data(hue_feed["key"], hue_value) + print(f"Sent Hue value {hue_value} to Adafruit IO feed 'hue'") + except AdafruitIO_RequestError as e: + print(f"Error sending data: {e}") + + time.sleep(3) diff --git a/ESP32-S3_BLE_iOS_Media/Arial-16.bdf b/ESP32-S3_BLE_iOS_Media/Arial-16.bdf new file mode 100644 index 000000000..087da7de2 --- /dev/null +++ b/ESP32-S3_BLE_iOS_Media/Arial-16.bdf @@ -0,0 +1,7366 @@ +STARTFONT 2.1 +COMMENT +COMMENT Converted from OpenType font "arial.ttf" by "otf2bdf 3.0". +COMMENT +FONT -FreeType-Arial-Medium-R-Normal--22-160-100-100-P-109-ISO10646-1 +SIZE 16 100 100 +FONTBOUNDINGBOX 43 29 -11 -7 +STARTPROPERTIES 19 +FOUNDRY "FreeType" +FAMILY_NAME "Arial" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 22 +POINT_SIZE 160 +RESOLUTION_X 100 +RESOLUTION_Y 100 +SPACING "P" +AVERAGE_WIDTH 109 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONT_ASCENT 19 +FONT_DESCENT 4 +COPYRIGHT "© 2017 The Monotype Corporation. All Rights Reserved. Hebrew OpenType Layout logic copyright © 2003 & 2007, Ralph Hancock & John Hudson. This layout logic for Biblical Hebrew is open source software under the MIT License; see embedded license description for details." +_OTF_FONTFILE "arial.ttf" +_OTF_PSNAME "ArialMT" +ENDPROPERTIES +CHARS 3361 +STARTCHAR 0020 +ENCODING 32 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0021 +ENCODING 33 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 2 16 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR 0022 +ENCODING 34 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 6 6 1 10 +BITMAP +CC +CC +CC +CC +CC +CC +ENDCHAR +STARTCHAR 0023 +ENCODING 35 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 16 0 0 +BITMAP +0C60 +0C60 +0C60 +18C0 +FFF0 +FFF0 +18C0 +18C0 +3180 +3180 +FFF0 +FFF0 +3180 +6300 +6300 +6300 +ENDCHAR +STARTCHAR 0024 +ENCODING 36 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 19 1 -2 +BITMAP +0800 +3E00 +7F80 +E9C0 +C8C0 +C800 +E800 +7800 +3F00 +0F80 +09C0 +08C0 +C8C0 +C8C0 +6980 +7F80 +3E00 +0800 +0800 +ENDCHAR +STARTCHAR 0025 +ENCODING 37 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 18 16 1 0 +BITMAP +380600 +6C0C00 +C60C00 +C61800 +C63000 +C63000 +C66000 +6C6700 +38CD80 +0198C0 +0198C0 +0318C0 +0318C0 +0618C0 +0C0D80 +0C0700 +ENDCHAR +STARTCHAR 0026 +ENCODING 38 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 13 16 1 0 +BITMAP +0E00 +1F00 +3180 +3180 +3180 +1B00 +1F00 +1C00 +7600 +6330 +C1B0 +C1E0 +C0E0 +61A0 +7F98 +1E10 +ENDCHAR +STARTCHAR 0027 +ENCODING 39 +SWIDTH 180 0 +DWIDTH 4 0 +BBX 2 6 1 10 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0028 +ENCODING 40 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 20 1 -4 +BITMAP +08 +10 +30 +20 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +60 +60 +20 +30 +10 +08 +ENDCHAR +STARTCHAR 0029 +ENCODING 41 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 20 1 -4 +BITMAP +80 +40 +60 +20 +30 +30 +18 +18 +18 +18 +18 +18 +18 +18 +30 +30 +20 +60 +40 +80 +ENDCHAR +STARTCHAR 002A +ENCODING 42 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 8 7 1 9 +BITMAP +18 +18 +FF +3C +3C +66 +24 +ENDCHAR +STARTCHAR 002B +ENCODING 43 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 10 10 1 3 +BITMAP +0C00 +0C00 +0C00 +0C00 +FFC0 +FFC0 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 002C +ENCODING 44 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 2 5 2 -3 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR 002D +ENCODING 45 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 6 2 0 5 +BITMAP +FC +FC +ENDCHAR +STARTCHAR 002E +ENCODING 46 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 2 2 2 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 002F +ENCODING 47 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 16 0 0 +BITMAP +06 +06 +0C +0C +0C +18 +18 +18 +30 +30 +30 +60 +60 +60 +E0 +C0 +ENDCHAR +STARTCHAR 0030 +ENCODING 48 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +1E00 +3F80 +6180 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +6180 +3F00 +1E00 +ENDCHAR +STARTCHAR 0031 +ENCODING 49 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 6 16 2 0 +BITMAP +0C +0C +1C +7C +EC +8C +0C +0C +0C +0C +0C +0C +0C +0C +0C +0C +ENDCHAR +STARTCHAR 0032 +ENCODING 50 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +3F00 +7F80 +E1C0 +C0C0 +00C0 +00C0 +00C0 +0180 +0300 +0600 +0C00 +1800 +3000 +6000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 0033 +ENCODING 51 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +3E00 +7F00 +E380 +C180 +0180 +0300 +0E00 +0F00 +0180 +00C0 +00C0 +00C0 +C0C0 +E180 +7F80 +3E00 +ENDCHAR +STARTCHAR 0034 +ENCODING 52 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +0300 +0700 +0F00 +0F00 +1B00 +1B00 +3300 +7300 +6300 +C300 +FFC0 +FFC0 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 0035 +ENCODING 53 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +3F80 +3F80 +6000 +6000 +6000 +7E00 +FF80 +C180 +00C0 +00C0 +00C0 +00C0 +C0C0 +E180 +7F80 +3E00 +ENDCHAR +STARTCHAR 0036 +ENCODING 54 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +1F00 +3F80 +61C0 +60C0 +C000 +C000 +CF00 +FF80 +E1C0 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +7F80 +1E00 +ENDCHAR +STARTCHAR 0037 +ENCODING 55 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +FFC0 +FFC0 +0080 +0180 +0300 +0600 +0600 +0C00 +0C00 +1800 +1800 +1800 +1000 +3000 +3000 +3000 +ENDCHAR +STARTCHAR 0038 +ENCODING 56 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +1E00 +3F00 +6180 +6180 +6180 +6180 +3F00 +3F00 +6180 +C0C0 +C0C0 +C0C0 +C0C0 +6180 +7F80 +1E00 +ENDCHAR +STARTCHAR 0039 +ENCODING 57 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +1E00 +7F00 +6180 +C080 +C0C0 +C0C0 +C0C0 +E1C0 +7FC0 +3CC0 +00C0 +00C0 +C180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR 003A +ENCODING 58 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 2 12 2 0 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR 003B +ENCODING 59 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 2 15 2 -3 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +00 +00 +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR 003C +ENCODING 60 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 11 1 2 +BITMAP +0020 +00E0 +07C0 +1E00 +7800 +C000 +7800 +1E00 +07C0 +00E0 +0020 +ENDCHAR +STARTCHAR 003D +ENCODING 61 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 7 1 4 +BITMAP +FFE0 +FFE0 +0000 +0000 +0000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 003E +ENCODING 62 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 11 1 2 +BITMAP +8000 +E000 +7C00 +0F00 +03C0 +0060 +03C0 +0F00 +7C00 +E000 +8000 +ENDCHAR +STARTCHAR 003F +ENCODING 63 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +3F00 +7F80 +E1C0 +C0C0 +00C0 +01C0 +0380 +0700 +0600 +0C00 +0C00 +0C00 +0000 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR 0040 +ENCODING 64 +SWIDTH 990 0 +DWIDTH 22 0 +BBX 20 21 1 -5 +BITMAP +01F800 +07FE00 +1E0780 +180180 +31CCC0 +77ECE0 +6E3860 +6C1860 +DC1860 +D81860 +D81860 +D830C0 +D831C0 +DC7380 +EFFF00 +671C00 +700030 +3800E0 +1E03C0 +0FFF80 +01FC00 +ENDCHAR +STARTCHAR 0041 +ENCODING 65 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 16 0 0 +BITMAP +0380 +0380 +06C0 +06C0 +0EE0 +0C60 +0C60 +1830 +1830 +3FF8 +3FF8 +3018 +600C +600C +C006 +C006 +ENDCHAR +STARTCHAR 0042 +ENCODING 66 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 16 2 0 +BITMAP +FF80 +FFC0 +C0E0 +C060 +C060 +C060 +C0C0 +FFC0 +FFC0 +C060 +C030 +C030 +C030 +C070 +FFE0 +FF80 +ENDCHAR +STARTCHAR 0043 +ENCODING 67 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 14 16 1 0 +BITMAP +07C0 +1FF0 +3838 +6018 +600C +C000 +C000 +C000 +C000 +C000 +C000 +600C +6018 +3838 +1FF0 +0FC0 +ENDCHAR +STARTCHAR 0044 +ENCODING 68 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 16 2 0 +BITMAP +FF80 +FFE0 +C070 +C030 +C038 +C018 +C018 +C018 +C018 +C018 +C018 +C030 +C030 +C0E0 +FFE0 +FF80 +ENDCHAR +STARTCHAR 0045 +ENCODING 69 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 16 2 0 +BITMAP +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 0046 +ENCODING 70 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 10 16 2 0 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0047 +ENCODING 71 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 16 1 0 +BITMAP +07E0 +1FF8 +381C +700C +6006 +C000 +C000 +C000 +C0FE +C0FE +C006 +6006 +7006 +381E +1FFC +07E0 +ENDCHAR +STARTCHAR 0048 +ENCODING 72 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 16 2 0 +BITMAP +C030 +C030 +C030 +C030 +C030 +C030 +C030 +FFF0 +FFF0 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +ENDCHAR +STARTCHAR 0049 +ENCODING 73 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 2 16 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 004A +ENCODING 74 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 8 16 1 0 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +C3 +C3 +E7 +7E +3C +ENDCHAR +STARTCHAR 004B +ENCODING 75 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 13 16 2 0 +BITMAP +C070 +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +FC00 +FE00 +E700 +C380 +C1C0 +C0C0 +C0E0 +C070 +C038 +ENDCHAR +STARTCHAR 004C +ENCODING 76 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 16 2 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 004D +ENCODING 77 +SWIDTH 855 0 +DWIDTH 19 0 +BBX 15 16 2 0 +BITMAP +E00E +F01E +F01E +F01E +D836 +D836 +D836 +CC66 +CC66 +CC66 +C6C6 +C6C6 +C6C6 +C386 +C386 +C386 +ENDCHAR +STARTCHAR 004E +ENCODING 78 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 16 2 0 +BITMAP +C030 +E030 +F030 +F030 +D830 +D830 +CC30 +C630 +C630 +C330 +C1B0 +C1B0 +C0F0 +C0F0 +C070 +C030 +ENDCHAR +STARTCHAR 004F +ENCODING 79 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 16 1 0 +BITMAP +07C0 +1FF0 +3838 +701C +600C +C006 +C006 +C006 +C006 +C006 +C006 +600C +701C +3838 +1FF0 +07C0 +ENDCHAR +STARTCHAR 0050 +ENCODING 80 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 16 2 0 +BITMAP +FF80 +FFE0 +C060 +C030 +C030 +C030 +C030 +C060 +FFE0 +FF80 +C000 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0051 +ENCODING 81 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 17 1 -1 +BITMAP +07C0 +1FF0 +3838 +701C +600C +C006 +C006 +C006 +C006 +C006 +C006 +600C +70EC +3838 +1FF8 +07EE +0002 +ENDCHAR +STARTCHAR 0052 +ENCODING 82 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 16 2 0 +BITMAP +FFC0 +FFE0 +C070 +C030 +C030 +C030 +C070 +FFE0 +FFC0 +C300 +C180 +C1C0 +C0E0 +C060 +C070 +C030 +ENDCHAR +STARTCHAR 0053 +ENCODING 83 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 13 16 1 0 +BITMAP +0FC0 +3FE0 +7070 +6018 +6018 +7000 +3C00 +1FC0 +03F0 +0038 +C018 +C018 +6018 +7070 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 0054 +ENCODING 84 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 16 1 0 +BITMAP +FFF0 +FFF0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0055 +ENCODING 85 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 16 2 0 +BITMAP +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +E070 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0056 +ENCODING 86 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 16 0 0 +BITMAP +C006 +E00E +600C +600C +3018 +3018 +3838 +1830 +1830 +0C60 +0C60 +0C60 +06C0 +06C0 +07C0 +0380 +ENDCHAR +STARTCHAR 0057 +ENCODING 87 +SWIDTH 945 0 +DWIDTH 21 0 +BBX 21 16 0 0 +BITMAP +C07018 +C07018 +60D830 +60D830 +60D830 +60D830 +318C60 +318C60 +318C60 +318C60 +1B06C0 +1B06C0 +1B06C0 +1B06C0 +0E0380 +0E0380 +ENDCHAR +STARTCHAR 0058 +ENCODING 88 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 16 0 0 +BITMAP +701C +3838 +1830 +0C60 +0EE0 +06C0 +0380 +0380 +0380 +06C0 +0C60 +1C70 +1830 +3018 +701C +E00E +ENDCHAR +STARTCHAR 0059 +ENCODING 89 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 14 16 0 0 +BITMAP +E01C +6018 +3030 +3870 +1860 +0CC0 +0FC0 +0780 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 005A +ENCODING 90 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 16 0 0 +BITMAP +7FF0 +7FF0 +0060 +00C0 +00C0 +0180 +0300 +0600 +0600 +0C00 +1800 +3000 +3000 +6000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 005B +ENCODING 91 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 20 1 -4 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR 005C +ENCODING 92 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 16 0 0 +BITMAP +C0 +C0 +60 +60 +60 +30 +30 +30 +18 +18 +18 +0C +0C +0C +0E +06 +ENDCHAR +STARTCHAR 005D +ENCODING 93 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 4 20 1 -4 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR 005E +ENCODING 94 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 9 0 7 +BITMAP +0C00 +1E00 +1E00 +3300 +3300 +3300 +6180 +6180 +C0C0 +ENDCHAR +STARTCHAR 005F +ENCODING 95 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 2 0 -4 +BITMAP +FFF0 +FFF0 +ENDCHAR +STARTCHAR 0060 +ENCODING 96 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 3 3 1 13 +BITMAP +C0 +60 +20 +ENDCHAR +STARTCHAR 0061 +ENCODING 97 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 12 1 0 +BITMAP +3E00 +7F00 +C180 +C180 +0780 +7F80 +7980 +C180 +C180 +C380 +7F80 +7CC0 +ENDCHAR +STARTCHAR 0062 +ENCODING 98 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +C000 +C000 +C000 +C000 +DE00 +FF80 +E180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +E180 +FF80 +DE00 +ENDCHAR +STARTCHAR 0063 +ENCODING 99 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +1E00 +7F00 +6380 +C180 +C000 +C000 +C000 +C000 +C180 +6380 +7F00 +1E00 +ENDCHAR +STARTCHAR 0064 +ENCODING 100 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +00C0 +00C0 +00C0 +00C0 +1EC0 +7FC0 +61C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +E1C0 +7FC0 +1EC0 +ENDCHAR +STARTCHAR 0065 +ENCODING 101 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 12 1 0 +BITMAP +1E00 +7F80 +6180 +C0C0 +FFC0 +FFC0 +C000 +C000 +E0C0 +7180 +3F80 +1E00 +ENDCHAR +STARTCHAR 0066 +ENCODING 102 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 7 16 0 0 +BITMAP +1E +3E +30 +30 +FC +FC +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 0067 +ENCODING 103 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 -4 +BITMAP +1EC0 +7FC0 +61C0 +E0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +61C0 +7FC0 +1EC0 +00C0 +C180 +FF80 +3E00 +ENDCHAR +STARTCHAR 0068 +ENCODING 104 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +C000 +C000 +C000 +C000 +DE00 +FF00 +E380 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR 0069 +ENCODING 105 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 2 16 1 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 006A +ENCODING 106 +SWIDTH 180 0 +DWIDTH 4 0 +BBX 4 20 -1 -4 +BITMAP +30 +30 +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 006B +ENCODING 107 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 9 16 1 0 +BITMAP +C000 +C000 +C000 +C000 +C380 +C700 +CE00 +DC00 +F800 +FC00 +EC00 +CE00 +C600 +C700 +C300 +C380 +ENDCHAR +STARTCHAR 006C +ENCODING 108 +SWIDTH 180 0 +DWIDTH 4 0 +BBX 2 16 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 006D +ENCODING 109 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 16 12 1 0 +BITMAP +DE3C +FF7E +E3C7 +C183 +C183 +C183 +C183 +C183 +C183 +C183 +C183 +C183 +ENDCHAR +STARTCHAR 006E +ENCODING 110 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +DE00 +FF00 +E380 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR 006F +ENCODING 111 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 12 1 0 +BITMAP +1F00 +3F80 +71C0 +E0E0 +C060 +C060 +C060 +C060 +E0E0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0070 +ENCODING 112 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 -4 +BITMAP +DE00 +FF80 +E180 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +E180 +FF00 +DE00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0071 +ENCODING 113 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 -4 +BITMAP +1EC0 +7FC0 +61C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +61C0 +7FC0 +1EC0 +00C0 +00C0 +00C0 +00C0 +ENDCHAR +STARTCHAR 0072 +ENCODING 114 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 6 12 1 0 +BITMAP +DC +FC +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0073 +ENCODING 115 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +3E00 +7F00 +C180 +C000 +F000 +7E00 +1F80 +0380 +0180 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0074 +ENCODING 116 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 5 16 0 0 +BITMAP +20 +60 +60 +60 +F8 +F8 +60 +60 +60 +60 +60 +60 +60 +60 +78 +38 +ENDCHAR +STARTCHAR 0075 +ENCODING 117 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +E380 +7F80 +3D80 +ENDCHAR +STARTCHAR 0076 +ENCODING 118 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 12 0 0 +BITMAP +C060 +C060 +60C0 +60C0 +3180 +3180 +3180 +1B00 +1B00 +0E00 +0E00 +0400 +ENDCHAR +STARTCHAR 0077 +ENCODING 119 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 12 0 0 +BITMAP +C106 +C386 +C386 +628C +66CC +26C8 +36D8 +36D8 +1450 +1C70 +1C70 +0C60 +ENDCHAR +STARTCHAR 0078 +ENCODING 120 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 10 12 0 0 +BITMAP +E1C0 +6180 +3300 +3300 +1E00 +0C00 +0C00 +1E00 +3300 +3300 +6180 +E1C0 +ENDCHAR +STARTCHAR 0079 +ENCODING 121 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 16 0 -4 +BITMAP +C060 +C060 +60C0 +60C0 +30C0 +3180 +1980 +1980 +0F00 +0F00 +0700 +0600 +0E00 +0C00 +7C00 +7800 +ENDCHAR +STARTCHAR 007A +ENCODING 122 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 12 0 0 +BITMAP +7FC0 +7FC0 +01C0 +0380 +0700 +0E00 +1C00 +3800 +7000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 007B +ENCODING 123 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 6 20 0 -4 +BITMAP +1C +3C +30 +30 +30 +30 +30 +30 +60 +E0 +E0 +60 +30 +30 +30 +30 +30 +30 +3C +1C +ENDCHAR +STARTCHAR 007C +ENCODING 124 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 2 21 2 -5 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 007D +ENCODING 125 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 6 20 1 -4 +BITMAP +E0 +F0 +30 +30 +30 +30 +30 +30 +38 +1C +1C +38 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 007E +ENCODING 126 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 4 1 6 +BITMAP +7800 +FE20 +8FE0 +03C0 +ENDCHAR +STARTCHAR 00A0 +ENCODING 160 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 00A1 +ENCODING 161 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 2 16 2 -4 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00A2 +ENCODING 162 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 20 1 -4 +BITMAP +0100 +0100 +0100 +0100 +1E00 +3F80 +6380 +E4C0 +C400 +C400 +C800 +C800 +E8C0 +7980 +3F80 +1E00 +1000 +2000 +2000 +2000 +ENDCHAR +STARTCHAR 00A3 +ENCODING 163 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 16 0 0 +BITMAP +1F00 +3F80 +71C0 +60C0 +6000 +6000 +6000 +FE00 +FE00 +3000 +3000 +3000 +6000 +7C40 +FFE0 +83C0 +ENDCHAR +STARTCHAR 00A4 +ENCODING 164 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 11 1 2 +BITMAP +4040 +EEE0 +7FC0 +3180 +60C0 +60C0 +60C0 +3180 +7FC0 +EEE0 +4040 +ENDCHAR +STARTCHAR 00A5 +ENCODING 165 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 16 0 0 +BITMAP +C030 +6060 +6060 +30C0 +30C0 +1980 +1F80 +0F00 +7FE0 +7FE0 +0600 +0600 +7FE0 +7FE0 +0600 +0600 +ENDCHAR +STARTCHAR 00A6 +ENCODING 166 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 2 21 2 -5 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +00 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00A7 +ENCODING 167 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 20 1 -4 +BITMAP +1E00 +3F00 +7380 +6180 +6000 +3800 +7C00 +CE00 +C380 +C1C0 +E0C0 +70C0 +1D80 +0F00 +0700 +0180 +6180 +7180 +3F00 +1E00 +ENDCHAR +STARTCHAR 00A8 +ENCODING 168 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 6 2 1 14 +BITMAP +CC +CC +ENDCHAR +STARTCHAR 00A9 +ENCODING 169 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 16 0 0 +BITMAP +07E0 +1818 +2004 +43C2 +4422 +8811 +8801 +8801 +8801 +8801 +8811 +4422 +43C2 +2004 +1818 +07E0 +ENDCHAR +STARTCHAR 00AA +ENCODING 170 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 7 8 0 8 +BITMAP +7C +C6 +06 +3E +F6 +C6 +CE +76 +ENDCHAR +STARTCHAR 00AB +ENCODING 171 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 10 1 1 +BITMAP +1980 +3300 +7700 +6600 +CC00 +CC00 +6600 +7700 +3300 +1980 +ENDCHAR +STARTCHAR 00AC +ENCODING 172 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 6 1 5 +BITMAP +FFE0 +FFE0 +0060 +0060 +0060 +0060 +ENDCHAR +STARTCHAR 00AD +ENCODING 173 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 6 2 0 5 +BITMAP +FC +FC +ENDCHAR +STARTCHAR 00AE +ENCODING 174 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 16 16 0 0 +BITMAP +07E0 +1818 +2004 +47C2 +4422 +8421 +8421 +87C1 +8481 +8441 +8421 +4422 +4412 +2004 +1818 +07E0 +ENDCHAR +STARTCHAR 00AF +ENCODING 175 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 13 2 -1 17 +BITMAP +FFF8 +FFF8 +ENDCHAR +STARTCHAR 00B0 +ENCODING 176 +SWIDTH 405 0 +DWIDTH 9 0 +BBX 6 6 1 10 +BITMAP +78 +CC +84 +84 +CC +78 +ENDCHAR +STARTCHAR 00B1 +ENCODING 177 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 13 1 0 +BITMAP +0C00 +0C00 +0C00 +0C00 +FFC0 +FFC0 +0C00 +0C00 +0C00 +0C00 +0000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 00B2 +ENCODING 178 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 7 8 0 8 +BITMAP +7C +C6 +06 +0E +1C +38 +60 +FE +ENDCHAR +STARTCHAR 00B3 +ENCODING 179 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 7 8 0 8 +BITMAP +7C +C6 +06 +18 +06 +06 +C6 +7C +ENDCHAR +STARTCHAR 00B4 +ENCODING 180 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 3 3 2 13 +BITMAP +60 +C0 +80 +ENDCHAR +STARTCHAR 00B5 +ENCODING 181 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 -4 +BITMAP +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +E1C0 +FFC0 +DEC0 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 00B6 +ENCODING 182 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 12 20 0 -4 +BITMAP +3FF0 +7FF0 +FC60 +FC60 +FC60 +FC60 +FC60 +7C60 +3C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +0C60 +ENDCHAR +STARTCHAR 00B7 +ENCODING 183 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 2 2 3 7 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 00B8 +ENCODING 184 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 4 1 -4 +BITMAP +20 +30 +18 +F0 +ENDCHAR +STARTCHAR 00B9 +ENCODING 185 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 4 8 1 8 +BITMAP +30 +70 +F0 +B0 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00BA +ENCODING 186 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 8 8 0 8 +BITMAP +3C +66 +C3 +C3 +C3 +C3 +66 +3C +ENDCHAR +STARTCHAR 00BB +ENCODING 187 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 10 2 1 +BITMAP +CC00 +6600 +7700 +3300 +1980 +1980 +3300 +7700 +6600 +CC00 +ENDCHAR +STARTCHAR 00BC +ENCODING 188 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 16 16 2 0 +BITMAP +300C +7018 +F030 +B060 +3060 +30C0 +3180 +3300 +0306 +060E +0C1E +0C36 +1866 +307F +6006 +6006 +ENDCHAR +STARTCHAR 00BD +ENCODING 189 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 16 16 2 0 +BITMAP +300C +7018 +F030 +B060 +3060 +30C0 +3180 +3180 +031E +0633 +0C03 +0C07 +1806 +300C +7018 +603F +ENDCHAR +STARTCHAR 00BE +ENCODING 190 +SWIDTH 810 0 +DWIDTH 18 0 +BBX 17 16 0 0 +BITMAP +7C0300 +C60600 +060C00 +180C00 +061800 +063000 +C63000 +7C6000 +00C300 +018700 +018F00 +031B00 +063300 +0C3F80 +0C0300 +180300 +ENDCHAR +STARTCHAR 00BF +ENCODING 191 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 9 16 2 -4 +BITMAP +0C00 +0C00 +0000 +0000 +0C00 +0C00 +0C00 +1800 +3800 +7000 +E000 +C000 +C180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00C0 +ENCODING 192 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0300 +0180 +0080 +0000 +0380 +0380 +06C0 +06C0 +0EE0 +0C60 +0C60 +1830 +1830 +3FF8 +3FF8 +3018 +600C +600C +C006 +C006 +ENDCHAR +STARTCHAR 00C1 +ENCODING 193 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0180 +0300 +0200 +0000 +0380 +0380 +06C0 +06C0 +0EE0 +0C60 +0C60 +1830 +1830 +3FF8 +3FF8 +3018 +600C +600C +C006 +C006 +ENDCHAR +STARTCHAR 00C2 +ENCODING 194 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0180 +03C0 +0660 +0000 +0380 +0380 +06C0 +06C0 +0EE0 +0C60 +0C60 +1830 +1830 +3FF8 +3FF8 +3018 +600C +600C +C006 +C006 +ENDCHAR +STARTCHAR 00C3 +ENCODING 195 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0760 +0FE0 +0DC0 +0000 +0380 +0380 +06C0 +06C0 +0EE0 +0C60 +0C60 +1830 +1830 +3FF8 +3FF8 +3018 +600C +600C +C006 +C006 +ENDCHAR +STARTCHAR 00C4 +ENCODING 196 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 19 0 0 +BITMAP +0660 +0660 +0000 +0380 +0380 +06C0 +06C0 +0EE0 +0C60 +0C60 +1830 +1830 +3FF8 +3FF8 +3018 +600C +600C +C006 +C006 +ENDCHAR +STARTCHAR 00C5 +ENCODING 197 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0380 +0440 +0440 +0440 +0380 +0380 +06C0 +06C0 +0EE0 +0C60 +0C60 +1830 +1830 +3FF8 +3FF8 +3018 +600C +600C +C006 +C006 +ENDCHAR +STARTCHAR 00C6 +ENCODING 198 +SWIDTH 990 0 +DWIDTH 22 0 +BBX 21 16 0 0 +BITMAP +00FFF8 +01FFF8 +019800 +031800 +061800 +061800 +0C1800 +0C1FF0 +181FF0 +1FF800 +3FF800 +301800 +601800 +601800 +C01FF8 +C01FF8 +ENDCHAR +STARTCHAR 00C7 +ENCODING 199 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 14 20 1 -4 +BITMAP +07C0 +1FF0 +3838 +6018 +600C +C000 +C000 +C000 +C000 +C000 +C000 +600C +6018 +3838 +1FF0 +0FC0 +0200 +0300 +0180 +0F00 +ENDCHAR +STARTCHAR 00C8 +ENCODING 200 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 20 2 0 +BITMAP +0C00 +0600 +0200 +0000 +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 00C9 +ENCODING 201 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 20 2 0 +BITMAP +0300 +0600 +0400 +0000 +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 00CA +ENCODING 202 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 20 2 0 +BITMAP +0600 +0F00 +1980 +0000 +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 00CB +ENCODING 203 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 19 2 0 +BITMAP +1980 +1980 +0000 +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 00CC +ENCODING 204 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 20 1 0 +BITMAP +C0 +60 +20 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 00CD +ENCODING 205 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 20 2 0 +BITMAP +60 +C0 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00CE +ENCODING 206 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 20 0 0 +BITMAP +30 +78 +CC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00CF +ENCODING 207 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 19 0 0 +BITMAP +CC +CC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00D0 +ENCODING 208 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 16 0 0 +BITMAP +3FE0 +3FF8 +301C +300C +300E +3006 +3006 +FF06 +FF06 +3006 +3006 +300C +300C +303C +3FF8 +3FE0 +ENDCHAR +STARTCHAR 00D1 +ENCODING 209 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +0EC0 +1FC0 +1B80 +0000 +C030 +E030 +F030 +F030 +D830 +D830 +CC30 +C630 +C630 +C330 +C1B0 +C1B0 +C0F0 +C0F0 +C070 +C030 +ENDCHAR +STARTCHAR 00D2 +ENCODING 210 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 20 1 0 +BITMAP +0300 +0180 +0080 +0000 +07C0 +1FF0 +3838 +701C +600C +C006 +C006 +C006 +C006 +C006 +C006 +600C +701C +3838 +1FF0 +07C0 +ENDCHAR +STARTCHAR 00D3 +ENCODING 211 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 20 1 0 +BITMAP +0180 +0300 +0200 +0000 +07C0 +1FF0 +3838 +701C +600C +C006 +C006 +C006 +C006 +C006 +C006 +600C +701C +3838 +1FF0 +07C0 +ENDCHAR +STARTCHAR 00D4 +ENCODING 212 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 20 1 0 +BITMAP +0180 +03C0 +0660 +0000 +07C0 +1FF0 +3838 +701C +600C +C006 +C006 +C006 +C006 +C006 +C006 +600C +701C +3838 +1FF0 +07C0 +ENDCHAR +STARTCHAR 00D5 +ENCODING 213 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 20 1 0 +BITMAP +0760 +0FE0 +0DC0 +0000 +07C0 +1FF0 +3838 +701C +600C +C006 +C006 +C006 +C006 +C006 +C006 +600C +701C +3838 +1FF0 +07C0 +ENDCHAR +STARTCHAR 00D6 +ENCODING 214 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 19 1 0 +BITMAP +0660 +0660 +0000 +07C0 +1FF0 +3838 +701C +600C +C006 +C006 +C006 +C006 +C006 +C006 +600C +701C +3838 +1FF0 +07C0 +ENDCHAR +STARTCHAR 00D7 +ENCODING 215 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 9 9 2 3 +BITMAP +8100 +E380 +7700 +3E00 +1C00 +3E00 +7700 +E380 +8100 +ENDCHAR +STARTCHAR 00D8 +ENCODING 216 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 16 1 -1 +BITMAP +07C6 +1FFC +383C +701C +603C +C066 +C0C6 +C186 +C306 +C606 +C606 +6C0C +781C +3838 +7FF0 +CFC0 +ENDCHAR +STARTCHAR 00D9 +ENCODING 217 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +0C00 +0600 +0200 +0000 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +E070 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DA +ENCODING 218 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +0300 +0600 +0400 +0000 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +E070 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DB +ENCODING 219 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +0600 +0F00 +1980 +0000 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +E070 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DC +ENCODING 220 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 19 2 0 +BITMAP +1980 +1980 +0000 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +E070 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DD +ENCODING 221 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 14 20 0 0 +BITMAP +0180 +0300 +0200 +0000 +E01C +6018 +3030 +3870 +1860 +0CC0 +0FC0 +0780 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 00DE +ENCODING 222 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 16 2 0 +BITMAP +C000 +C000 +C000 +FF80 +FFE0 +C060 +C030 +C030 +C030 +C030 +C060 +FFE0 +FF80 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 00DF +ENCODING 223 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 16 2 0 +BITMAP +3E00 +7F00 +E380 +C180 +C180 +C300 +C700 +C600 +C700 +C380 +C0C0 +C060 +C060 +DCE0 +CFC0 +C780 +ENDCHAR +STARTCHAR 00E0 +ENCODING 224 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +1800 +0C00 +0400 +0000 +3E00 +7F00 +C180 +C180 +0780 +7F80 +7980 +C180 +C180 +C380 +7F80 +7CC0 +ENDCHAR +STARTCHAR 00E1 +ENCODING 225 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +0600 +0C00 +0800 +0000 +3E00 +7F00 +C180 +C180 +0780 +7F80 +7980 +C180 +C180 +C380 +7F80 +7CC0 +ENDCHAR +STARTCHAR 00E2 +ENCODING 226 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +0C00 +1E00 +3300 +0000 +3E00 +7F00 +C180 +C180 +0780 +7F80 +7980 +C180 +C180 +C380 +7F80 +7CC0 +ENDCHAR +STARTCHAR 00E3 +ENCODING 227 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +3B00 +7F00 +6E00 +0000 +3E00 +7F00 +C180 +C180 +0780 +7F80 +7980 +C180 +C180 +C380 +7F80 +7CC0 +ENDCHAR +STARTCHAR 00E4 +ENCODING 228 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +3300 +3300 +0000 +3E00 +7F00 +C180 +C180 +0780 +7F80 +7980 +C180 +C180 +C380 +7F80 +7CC0 +ENDCHAR +STARTCHAR 00E5 +ENCODING 229 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 18 1 0 +BITMAP +1C00 +2200 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C180 +C180 +0780 +7F80 +7980 +C180 +C180 +C380 +7F80 +7CC0 +ENDCHAR +STARTCHAR 00E6 +ENCODING 230 +SWIDTH 900 0 +DWIDTH 20 0 +BBX 18 12 1 0 +BITMAP +3F3E00 +7FFF80 +E0E180 +C0C0C0 +03FFC0 +3FFFC0 +7CC000 +C0C000 +C0C0C0 +E1E180 +7F7F80 +3C1E00 +ENDCHAR +STARTCHAR 00E7 +ENCODING 231 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 -4 +BITMAP +1E00 +7F00 +6380 +C180 +C000 +C000 +C000 +C000 +C180 +6380 +7F00 +1E00 +0800 +0C00 +0600 +3C00 +ENDCHAR +STARTCHAR 00E8 +ENCODING 232 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +1800 +0C00 +0400 +0000 +1E00 +7F80 +6180 +C0C0 +FFC0 +FFC0 +C000 +C000 +E0C0 +7180 +3F80 +1E00 +ENDCHAR +STARTCHAR 00E9 +ENCODING 233 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +0600 +0C00 +0800 +0000 +1E00 +7F80 +6180 +C0C0 +FFC0 +FFC0 +C000 +C000 +E0C0 +7180 +3F80 +1E00 +ENDCHAR +STARTCHAR 00EA +ENCODING 234 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +0C00 +1E00 +3300 +0000 +1E00 +7F80 +6180 +C0C0 +FFC0 +FFC0 +C000 +C000 +E0C0 +7180 +3F80 +1E00 +ENDCHAR +STARTCHAR 00EB +ENCODING 235 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +3300 +3300 +0000 +1E00 +7F80 +6180 +C0C0 +FFC0 +FFC0 +C000 +C000 +E0C0 +7180 +3F80 +1E00 +ENDCHAR +STARTCHAR 00EC +ENCODING 236 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 16 1 0 +BITMAP +C0 +60 +20 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 00ED +ENCODING 237 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 16 2 0 +BITMAP +60 +C0 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00EE +ENCODING 238 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 16 0 0 +BITMAP +30 +78 +CC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00EF +ENCODING 239 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 15 0 0 +BITMAP +CC +CC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00F0 +ENCODING 240 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +1900 +0F00 +1E00 +3300 +1D00 +7F80 +6180 +E1C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +6180 +7F80 +1E00 +ENDCHAR +STARTCHAR 00F1 +ENCODING 241 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +3B00 +7F00 +6E00 +0000 +DE00 +FF00 +E380 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR 00F2 +ENCODING 242 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 16 1 0 +BITMAP +0C00 +0600 +0200 +0000 +1F00 +3F80 +71C0 +E0E0 +C060 +C060 +C060 +C060 +E0E0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F3 +ENCODING 243 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 16 1 0 +BITMAP +0300 +0600 +0400 +0000 +1F00 +3F80 +71C0 +E0E0 +C060 +C060 +C060 +C060 +E0E0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F4 +ENCODING 244 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 16 1 0 +BITMAP +0600 +0F00 +1980 +0000 +1F00 +3F80 +71C0 +E0E0 +C060 +C060 +C060 +C060 +E0E0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F5 +ENCODING 245 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 16 1 0 +BITMAP +1D80 +3F80 +3700 +0000 +1F00 +3F80 +71C0 +E0E0 +C060 +C060 +C060 +C060 +E0E0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F6 +ENCODING 246 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 1 0 +BITMAP +1980 +1980 +0000 +1F00 +3F80 +71C0 +E0E0 +C060 +C060 +C060 +C060 +E0E0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR 00F7 +ENCODING 247 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 8 1 4 +BITMAP +0C00 +0C00 +0000 +FFC0 +FFC0 +0000 +0C00 +0C00 +ENDCHAR +STARTCHAR 00F8 +ENCODING 248 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 11 14 1 -1 +BITMAP +0060 +1F60 +7FC0 +71C0 +E3E0 +C660 +C660 +CC60 +D860 +F8E0 +71C0 +7F80 +DF00 +4000 +ENDCHAR +STARTCHAR 00F9 +ENCODING 249 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +3000 +1800 +0800 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +E380 +7F80 +3D80 +ENDCHAR +STARTCHAR 00FA +ENCODING 250 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +0600 +0C00 +0800 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +E380 +7F80 +3D80 +ENDCHAR +STARTCHAR 00FB +ENCODING 251 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +0C00 +1E00 +3300 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +E380 +7F80 +3D80 +ENDCHAR +STARTCHAR 00FC +ENCODING 252 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 15 1 0 +BITMAP +6600 +6600 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +E380 +7F80 +3D80 +ENDCHAR +STARTCHAR 00FD +ENCODING 253 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 20 0 -4 +BITMAP +0300 +0600 +0400 +0000 +C060 +C060 +60C0 +60C0 +30C0 +3180 +1980 +1980 +0F00 +0F00 +0700 +0600 +0E00 +0C00 +7C00 +7800 +ENDCHAR +STARTCHAR 00FE +ENCODING 254 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 20 1 -4 +BITMAP +C000 +C000 +C000 +C000 +DE00 +FF80 +E180 +C1C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +E180 +FF00 +DE00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 00FF +ENCODING 255 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 19 0 -4 +BITMAP +1980 +1980 +0000 +C060 +C060 +60C0 +60C0 +30C0 +3180 +1980 +1980 +0F00 +0F00 +0700 +0600 +0E00 +0C00 +7C00 +7800 +ENDCHAR +STARTCHAR 0100 +ENCODING 256 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 19 0 0 +BITMAP +07E0 +07E0 +0000 +0380 +0380 +06C0 +06C0 +0EE0 +0C60 +0C60 +1830 +1830 +3FF8 +3FF8 +3018 +600C +600C +C006 +C006 +ENDCHAR +STARTCHAR 0101 +ENCODING 257 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +3F00 +3F00 +0000 +3E00 +7F00 +C180 +C180 +0780 +7F80 +7980 +C180 +C180 +C380 +7F80 +7CC0 +ENDCHAR +STARTCHAR 0102 +ENCODING 258 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 0 +BITMAP +0820 +0C60 +07C0 +0000 +0380 +0380 +06C0 +06C0 +0EE0 +0C60 +0C60 +1830 +1830 +3FF8 +3FF8 +3018 +600C +600C +C006 +C006 +ENDCHAR +STARTCHAR 0103 +ENCODING 259 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +4100 +6300 +3E00 +0000 +3E00 +7F00 +C180 +C180 +0780 +7F80 +7980 +C180 +C180 +C380 +7F80 +7CC0 +ENDCHAR +STARTCHAR 0104 +ENCODING 260 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 20 0 -4 +BITMAP +0380 +0380 +06C0 +06C0 +0EE0 +0C60 +0C60 +1830 +1830 +3FF8 +3FF8 +3018 +600C +600C +C006 +C006 +0004 +0008 +0008 +000E +ENDCHAR +STARTCHAR 0105 +ENCODING 261 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 -4 +BITMAP +3E00 +7F00 +C180 +C180 +0780 +7F80 +7980 +C180 +C180 +C380 +7F80 +7CC0 +0080 +0100 +0100 +01C0 +ENDCHAR +STARTCHAR 0106 +ENCODING 262 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 14 20 1 0 +BITMAP +0180 +0300 +0200 +0000 +07C0 +1FF0 +3838 +6018 +600C +C000 +C000 +C000 +C000 +C000 +C000 +600C +6018 +3838 +1FF0 +0FC0 +ENDCHAR +STARTCHAR 0107 +ENCODING 263 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +0600 +0C00 +0800 +0000 +1E00 +7F00 +6380 +C180 +C000 +C000 +C000 +C000 +C180 +6380 +7F00 +1E00 +ENDCHAR +STARTCHAR 0108 +ENCODING 264 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 14 20 1 0 +BITMAP +0300 +0780 +0CC0 +0000 +07C0 +1FF0 +3838 +6018 +600C +C000 +C000 +C000 +C000 +C000 +C000 +600C +6018 +3838 +1FF0 +0FC0 +ENDCHAR +STARTCHAR 0109 +ENCODING 265 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +0C00 +1E00 +3300 +0000 +1E00 +7F00 +6380 +C180 +C000 +C000 +C000 +C000 +C180 +6380 +7F00 +1E00 +ENDCHAR +STARTCHAR 010A +ENCODING 266 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 14 19 1 0 +BITMAP +0180 +0180 +0000 +07C0 +1FF0 +3838 +6018 +600C +C000 +C000 +C000 +C000 +C000 +C000 +600C +6018 +3838 +1FF0 +0FC0 +ENDCHAR +STARTCHAR 010B +ENCODING 267 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 15 1 0 +BITMAP +0C00 +0C00 +0000 +1E00 +7F00 +6380 +C180 +C000 +C000 +C000 +C000 +C180 +6380 +7F00 +1E00 +ENDCHAR +STARTCHAR 010C +ENCODING 268 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 14 20 1 0 +BITMAP +0CC0 +0780 +0300 +0000 +07C0 +1FF0 +3838 +6018 +600C +C000 +C000 +C000 +C000 +C000 +C000 +600C +6018 +3838 +1FF0 +0FC0 +ENDCHAR +STARTCHAR 010D +ENCODING 269 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +3300 +1E00 +0C00 +0000 +1E00 +7F00 +6380 +C180 +C000 +C000 +C000 +C000 +C180 +6380 +7F00 +1E00 +ENDCHAR +STARTCHAR 010E +ENCODING 270 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 20 2 0 +BITMAP +3300 +1E00 +0C00 +0000 +FF80 +FFE0 +C070 +C030 +C038 +C018 +C018 +C018 +C018 +C018 +C018 +C030 +C030 +C0E0 +FFE0 +FF80 +ENDCHAR +STARTCHAR 010F +ENCODING 271 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 13 16 1 0 +BITMAP +00D8 +00D8 +00C8 +00C8 +1ED0 +7FC0 +61C0 +C1C0 +C0C0 +C0C0 +C0C0 +C0C0 +E0C0 +61C0 +3FC0 +1EC0 +ENDCHAR +STARTCHAR 0110 +ENCODING 272 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 15 16 0 0 +BITMAP +3FE0 +3FF8 +301C +300C +300E +3006 +3006 +FF06 +FF06 +3006 +3006 +300C +300C +303C +3FF8 +3FE0 +ENDCHAR +STARTCHAR 0111 +ENCODING 273 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 16 1 0 +BITMAP +00C0 +0FE0 +0FE0 +00C0 +1EC0 +7FC0 +61C0 +C1C0 +C0C0 +C0C0 +C0C0 +C0C0 +E0C0 +61C0 +3FC0 +1EC0 +ENDCHAR +STARTCHAR 0112 +ENCODING 274 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 19 2 0 +BITMAP +1F80 +1F80 +0000 +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 0113 +ENCODING 275 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +3F00 +3F00 +0000 +1E00 +7F80 +6180 +C0C0 +FFC0 +FFC0 +C000 +C000 +E0C0 +7180 +3F80 +1E00 +ENDCHAR +STARTCHAR 0114 +ENCODING 276 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 20 2 0 +BITMAP +1040 +18C0 +0F80 +0000 +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 0115 +ENCODING 277 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +2080 +3180 +1F00 +0000 +1E00 +7F80 +6180 +C0C0 +FFC0 +FFC0 +C000 +C000 +E0C0 +7180 +3F80 +1E00 +ENDCHAR +STARTCHAR 0116 +ENCODING 278 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 19 2 0 +BITMAP +0600 +0600 +0000 +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 0117 +ENCODING 279 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 15 1 0 +BITMAP +0C00 +0C00 +0000 +1E00 +7F80 +6180 +C0C0 +FFC0 +FFC0 +C000 +C000 +E0C0 +7180 +3F80 +1E00 +ENDCHAR +STARTCHAR 0118 +ENCODING 280 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 20 2 -4 +BITMAP +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +0020 +0040 +0040 +0070 +ENDCHAR +STARTCHAR 0119 +ENCODING 281 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 -4 +BITMAP +1E00 +7F80 +6180 +C0C0 +FFC0 +FFC0 +C000 +C000 +E0C0 +7180 +3F80 +1E00 +0200 +0400 +0400 +0700 +ENDCHAR +STARTCHAR 011A +ENCODING 282 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 12 20 2 0 +BITMAP +1980 +0F00 +0600 +0000 +FFF0 +FFF0 +C000 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +C000 +C000 +C000 +C000 +C000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 011B +ENCODING 283 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 0 +BITMAP +3300 +1E00 +0C00 +0000 +1E00 +7F80 +6180 +C0C0 +FFC0 +FFC0 +C000 +C000 +E0C0 +7180 +3F80 +1E00 +ENDCHAR +STARTCHAR 011C +ENCODING 284 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 20 1 0 +BITMAP +0180 +03C0 +0660 +0000 +07E0 +1FF8 +381C +700C +6006 +C000 +C000 +C000 +C0FE +C0FE +C006 +6006 +7006 +381E +1FFC +07E0 +ENDCHAR +STARTCHAR 011D +ENCODING 285 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 20 1 -4 +BITMAP +0C00 +1E00 +3300 +0000 +1EC0 +7FC0 +61C0 +E0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +61C0 +7FC0 +1EC0 +00C0 +C180 +FF80 +3E00 +ENDCHAR +STARTCHAR 011E +ENCODING 286 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 20 1 0 +BITMAP +0410 +0630 +03E0 +0000 +07E0 +1FF8 +381C +700C +6006 +C000 +C000 +C000 +C0FE +C0FE +C006 +6006 +7006 +381E +1FFC +07E0 +ENDCHAR +STARTCHAR 011F +ENCODING 287 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 20 1 -4 +BITMAP +2080 +3180 +1F00 +0000 +1EC0 +7FC0 +61C0 +E0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +61C0 +7FC0 +1EC0 +00C0 +C180 +FF80 +3E00 +ENDCHAR +STARTCHAR 0120 +ENCODING 288 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 19 1 0 +BITMAP +0180 +0180 +0000 +07E0 +1FF8 +381C +700C +6006 +C000 +C000 +C000 +C0FE +C0FE +C006 +6006 +7006 +381E +1FFC +07E0 +ENDCHAR +STARTCHAR 0121 +ENCODING 289 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 19 1 -4 +BITMAP +0C00 +0C00 +0000 +1EC0 +7FC0 +61C0 +E0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +61C0 +7FC0 +1EC0 +00C0 +C180 +FF80 +3E00 +ENDCHAR +STARTCHAR 0122 +ENCODING 290 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 23 1 -7 +BITMAP +07E0 +1FF8 +381C +700C +6006 +C000 +C000 +C000 +C0FE +C0FE +C006 +6006 +7006 +381E +1FFC +07E0 +0000 +0000 +00C0 +00C0 +0040 +00C0 +0080 +ENDCHAR +STARTCHAR 0123 +ENCODING 291 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 22 1 -4 +BITMAP +0400 +0800 +0800 +0C00 +0C00 +0000 +1EC0 +7FC0 +61C0 +E1C0 +C0C0 +C0C0 +C0C0 +C0C0 +C1C0 +61C0 +7FC0 +1EC0 +00C0 +C180 +FF80 +3E00 +ENDCHAR +STARTCHAR 0124 +ENCODING 292 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +0600 +0F00 +1980 +0000 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +FFF0 +FFF0 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +ENDCHAR +STARTCHAR 0125 +ENCODING 293 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 20 1 0 +BITMAP +0C00 +1E00 +3300 +0000 +C000 +C000 +C000 +C000 +DE00 +FF00 +E380 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR 0126 +ENCODING 294 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 14 16 1 0 +BITMAP +6018 +6018 +FFFC +FFFC +6018 +6018 +7FF8 +7FF8 +6018 +6018 +6018 +6018 +6018 +6018 +6018 +6018 +ENDCHAR +STARTCHAR 0127 +ENCODING 295 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 16 0 0 +BITMAP +6000 +FE00 +FE00 +6000 +6F00 +7F80 +70C0 +60C0 +60C0 +60C0 +60C0 +60C0 +60C0 +60C0 +60C0 +60C0 +ENDCHAR +STARTCHAR 0128 +ENCODING 296 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 20 0 0 +BITMAP +76 +FE +DC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 0129 +ENCODING 297 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 16 0 0 +BITMAP +76 +FE +DC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012A +ENCODING 298 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 19 0 0 +BITMAP +FC +FC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012B +ENCODING 299 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 15 0 0 +BITMAP +FC +FC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012C +ENCODING 300 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 20 0 0 +BITMAP +82 +C6 +7C +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012D +ENCODING 301 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 7 16 0 0 +BITMAP +82 +C6 +7C +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012E +ENCODING 302 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 3 20 1 -4 +BITMAP +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +40 +80 +80 +E0 +ENDCHAR +STARTCHAR 012F +ENCODING 303 +SWIDTH 225 0 +DWIDTH 5 0 +BBX 3 20 0 -4 +BITMAP +60 +60 +00 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +40 +80 +80 +E0 +ENDCHAR +STARTCHAR 0130 +ENCODING 304 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 2 19 2 0 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0131 +ENCODING 305 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 2 12 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0132 +ENCODING 306 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 16 2 0 +BITMAP +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +CC30 +CC30 +CE70 +C7E0 +C3C0 +ENDCHAR +STARTCHAR 0133 +ENCODING 307 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 7 20 1 -4 +BITMAP +C6 +C6 +00 +00 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +06 +06 +1E +1C +ENDCHAR +STARTCHAR 0134 +ENCODING 308 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 20 1 0 +BITMAP +0300 +0780 +0CC0 +0000 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +C300 +C300 +E700 +7E00 +3C00 +ENDCHAR +STARTCHAR 0135 +ENCODING 309 +SWIDTH 180 0 +DWIDTH 4 0 +BBX 6 20 -1 -4 +BITMAP +30 +78 +CC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0136 +ENCODING 310 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 13 23 2 -7 +BITMAP +C070 +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +FC00 +FE00 +E700 +C380 +C1C0 +C0C0 +C0E0 +C070 +C038 +0000 +0000 +0600 +0600 +0200 +0600 +0400 +ENDCHAR +STARTCHAR 0137 +ENCODING 311 +SWIDTH 450 0 +DWIDTH 10 0 +BBX 9 23 1 -7 +BITMAP +C000 +C000 +C000 +C000 +C380 +C700 +CE00 +DC00 +F800 +FC00 +EC00 +CE00 +C600 +C700 +C300 +C380 +0000 +0000 +0C00 +0C00 +0400 +0C00 +0800 +ENDCHAR +STARTCHAR 0138 +ENCODING 312 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +C180 +C300 +C600 +CC00 +D800 +F800 +CC00 +C600 +C600 +C300 +C180 +C180 +ENDCHAR +STARTCHAR 0139 +ENCODING 313 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 20 2 0 +BITMAP +1800 +3000 +2000 +0000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 013A +ENCODING 314 +SWIDTH 180 0 +DWIDTH 4 0 +BBX 3 20 1 0 +BITMAP +60 +C0 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 013B +ENCODING 315 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 23 2 -7 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +0000 +0000 +0C00 +0C00 +0400 +0C00 +0800 +ENDCHAR +STARTCHAR 013C +ENCODING 316 +SWIDTH 180 0 +DWIDTH 4 0 +BBX 2 23 1 -7 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +00 +C0 +C0 +40 +C0 +80 +ENDCHAR +STARTCHAR 013D +ENCODING 317 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 16 2 0 +BITMAP +C300 +C300 +C100 +C100 +C200 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 013E +ENCODING 318 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 5 16 2 0 +BITMAP +D8 +D8 +C8 +C8 +D0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 013F +ENCODING 319 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 9 16 2 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C600 +C600 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 0140 +ENCODING 320 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 6 16 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +CC +CC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0141 +ENCODING 321 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 11 16 0 0 +BITMAP +3000 +3000 +3000 +3100 +3300 +3600 +3C00 +3800 +7000 +F000 +B000 +3000 +3000 +3000 +3FE0 +3FE0 +ENDCHAR +STARTCHAR 0142 +ENCODING 322 +SWIDTH 180 0 +DWIDTH 4 0 +BBX 4 16 0 0 +BITMAP +60 +60 +60 +60 +60 +70 +70 +60 +E0 +E0 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 0143 +ENCODING 323 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +0300 +0600 +0400 +0000 +C030 +E030 +F030 +F030 +D830 +D830 +CC30 +C630 +C630 +C330 +C1B0 +C1B0 +C0F0 +C0F0 +C070 +C030 +ENDCHAR +STARTCHAR 0144 +ENCODING 324 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +0600 +0C00 +0800 +0000 +DE00 +FF00 +E380 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR 0145 +ENCODING 325 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 23 2 -7 +BITMAP +C030 +E030 +F030 +F030 +D830 +D830 +CC30 +C630 +C630 +C330 +C1B0 +C1B0 +C0F0 +C0F0 +C070 +C030 +0000 +0000 +0600 +0600 +0200 +0600 +0400 +ENDCHAR +STARTCHAR 0146 +ENCODING 326 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 19 1 -7 +BITMAP +DE00 +FF00 +E380 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +0000 +0000 +0C00 +0C00 +0400 +0C00 +0800 +ENDCHAR +STARTCHAR 0147 +ENCODING 327 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +1980 +0F00 +0600 +0000 +C030 +E030 +F030 +F030 +D830 +D830 +CC30 +C630 +C630 +C330 +C1B0 +C1B0 +C0F0 +C0F0 +C070 +C030 +ENDCHAR +STARTCHAR 0148 +ENCODING 328 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +3300 +1E00 +0C00 +0000 +DE00 +FF00 +E380 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR 0149 +ENCODING 329 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 16 0 0 +BITMAP +C000 +C000 +4000 +4000 +9BC0 +1FE0 +1C70 +1830 +1830 +1830 +1830 +1830 +1830 +1830 +1830 +1830 +ENDCHAR +STARTCHAR 014A +ENCODING 330 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 13 16 2 0 +BITMAP +CFC0 +DFE0 +F070 +E030 +C038 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C030 +C070 +C7E0 +C3C0 +ENDCHAR +STARTCHAR 014B +ENCODING 331 +SWIDTH 540 0 +DWIDTH 12 0 +BBX 10 16 1 -4 +BITMAP +DF00 +FF80 +E1C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +00C0 +00C0 +03C0 +0380 +ENDCHAR +STARTCHAR 014C +ENCODING 332 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 19 1 0 +BITMAP +07E0 +07E0 +0000 +07C0 +1FF0 +3838 +701C +600C +C006 +C006 +C006 +C006 +C006 +C006 +600C +701C +3838 +1FF0 +07C0 +ENDCHAR +STARTCHAR 014D +ENCODING 333 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 15 1 0 +BITMAP +3F00 +3F00 +0000 +1F00 +3F80 +71C0 +E0E0 +C060 +C060 +C060 +C060 +E0E0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR 014E +ENCODING 334 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 20 1 0 +BITMAP +0820 +0C60 +07C0 +0000 +07C0 +1FF0 +3838 +701C +600C +C006 +C006 +C006 +C006 +C006 +C006 +600C +701C +3838 +1FF0 +07C0 +ENDCHAR +STARTCHAR 014F +ENCODING 335 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 16 1 0 +BITMAP +2080 +3180 +1F00 +0000 +1F00 +3F80 +71C0 +E0E0 +C060 +C060 +C060 +C060 +E0E0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0150 +ENCODING 336 +SWIDTH 765 0 +DWIDTH 17 0 +BBX 15 20 1 0 +BITMAP +0660 +0CC0 +0CC0 +0000 +07C0 +1FF0 +3838 +701C +600C +C006 +C006 +C006 +C006 +C006 +C006 +600C +701C +3838 +1FF0 +07C0 +ENDCHAR +STARTCHAR 0151 +ENCODING 337 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 11 16 1 0 +BITMAP +1980 +3300 +3300 +0000 +1F00 +3F80 +71C0 +E0E0 +C060 +C060 +C060 +C060 +E0E0 +71C0 +3F80 +1F00 +ENDCHAR +STARTCHAR 0152 +ENCODING 338 +SWIDTH 990 0 +DWIDTH 22 0 +BBX 20 16 1 0 +BITMAP +0F9FF0 +3FDFF0 +787800 +603800 +603800 +C01800 +C01800 +C01FE0 +C01FE0 +C01800 +C01800 +603800 +603800 +707800 +3FDFF0 +0F9FF0 +ENDCHAR +STARTCHAR 0153 +ENCODING 339 +SWIDTH 945 0 +DWIDTH 21 0 +BBX 19 12 1 0 +BITMAP +1F0F00 +3F9F80 +71F0C0 +E0E060 +C06060 +C07FE0 +C07FE0 +C06000 +E0E060 +71F0C0 +3F9FC0 +1F0F80 +ENDCHAR +STARTCHAR 0154 +ENCODING 340 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +0600 +0C00 +0800 +0000 +FFC0 +FFE0 +C070 +C030 +C030 +C030 +C070 +FFE0 +FFC0 +C300 +C180 +C1C0 +C0E0 +C060 +C070 +C030 +ENDCHAR +STARTCHAR 0155 +ENCODING 341 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 6 16 1 0 +BITMAP +0C +18 +10 +00 +DC +FC +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0156 +ENCODING 342 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 23 2 -7 +BITMAP +FFC0 +FFE0 +C070 +C030 +C030 +C030 +C070 +FFE0 +FFC0 +C300 +C180 +C1C0 +C0E0 +C060 +C070 +C030 +0000 +0000 +0600 +0600 +0200 +0600 +0400 +ENDCHAR +STARTCHAR 0157 +ENCODING 343 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 6 19 1 -7 +BITMAP +DC +FC +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +00 +C0 +C0 +40 +C0 +80 +ENDCHAR +STARTCHAR 0158 +ENCODING 344 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +3300 +1E00 +0C00 +0000 +FFC0 +FFE0 +C070 +C030 +C030 +C030 +C070 +FFE0 +FFC0 +C300 +C180 +C1C0 +C0E0 +C060 +C070 +C030 +ENDCHAR +STARTCHAR 0159 +ENCODING 345 +SWIDTH 315 0 +DWIDTH 7 0 +BBX 6 16 1 0 +BITMAP +CC +78 +30 +00 +DC +FC +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 015A +ENCODING 346 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 13 20 1 0 +BITMAP +0180 +0300 +0200 +0000 +0FC0 +3FE0 +7070 +6018 +6018 +7000 +3C00 +1FC0 +03F0 +0038 +C018 +C018 +6018 +7070 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 015B +ENCODING 347 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +0600 +0C00 +0800 +0000 +3E00 +7F00 +C180 +C000 +F000 +7E00 +1F80 +0380 +0180 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 015C +ENCODING 348 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 13 20 1 0 +BITMAP +0300 +0780 +0CC0 +0000 +0FC0 +3FE0 +7070 +6018 +6018 +7000 +3C00 +1FC0 +03F0 +0038 +C018 +C018 +6018 +7070 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 015D +ENCODING 349 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +0C00 +1E00 +3300 +0000 +3E00 +7F00 +C180 +C000 +F000 +7E00 +1F80 +0380 +0180 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 015E +ENCODING 350 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 13 20 1 -4 +BITMAP +0FC0 +3FE0 +7070 +6018 +6018 +7000 +3C00 +1FC0 +03F0 +0038 +C018 +C018 +6018 +7070 +3FF0 +0FC0 +0200 +0300 +0180 +0F00 +ENDCHAR +STARTCHAR 015F +ENCODING 351 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 -4 +BITMAP +3E00 +7F00 +C180 +C000 +F000 +7E00 +1F80 +0380 +0180 +C380 +7F00 +3E00 +0800 +0C00 +0600 +3C00 +ENDCHAR +STARTCHAR 0160 +ENCODING 352 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 13 20 1 0 +BITMAP +0CC0 +0780 +0300 +0000 +0FC0 +3FE0 +7070 +6018 +6018 +7000 +3C00 +1FC0 +03F0 +0038 +C018 +C018 +6018 +7070 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 0161 +ENCODING 353 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +3300 +1E00 +0C00 +0000 +3E00 +7F00 +C180 +C000 +F000 +7E00 +1F80 +0380 +0180 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0162 +ENCODING 354 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 -4 +BITMAP +FFF0 +FFF0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0200 +0300 +0180 +0F00 +ENDCHAR +STARTCHAR 0163 +ENCODING 355 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 6 20 0 -4 +BITMAP +20 +60 +60 +60 +F8 +F8 +60 +60 +60 +60 +60 +60 +60 +60 +78 +38 +10 +18 +0C +78 +ENDCHAR +STARTCHAR 0164 +ENCODING 356 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 12 20 1 0 +BITMAP +1980 +0F00 +0600 +0000 +FFF0 +FFF0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0165 +ENCODING 357 +SWIDTH 360 0 +DWIDTH 8 0 +BBX 7 16 1 0 +BITMAP +26 +66 +62 +62 +FC +F8 +60 +60 +60 +60 +60 +60 +60 +60 +78 +38 +ENDCHAR +STARTCHAR 0166 +ENCODING 358 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 16 1 0 +BITMAP +FFF0 +FFF0 +0600 +0600 +0600 +0600 +0600 +0600 +3FC0 +3FC0 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0167 +ENCODING 359 +SWIDTH 270 0 +DWIDTH 6 0 +BBX 5 15 0 0 +BITMAP +60 +60 +60 +F8 +F8 +60 +60 +60 +F8 +F8 +60 +60 +60 +78 +38 +ENDCHAR +STARTCHAR 0168 +ENCODING 360 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +0EC0 +1FC0 +1B80 +0000 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +E070 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0169 +ENCODING 361 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +3B00 +7F00 +6E00 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +E380 +7F80 +3D80 +ENDCHAR +STARTCHAR 016A +ENCODING 362 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 19 2 0 +BITMAP +1F80 +1F80 +0000 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +E070 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 016B +ENCODING 363 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 15 1 0 +BITMAP +3F00 +3F00 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +E380 +7F80 +3D80 +ENDCHAR +STARTCHAR 016C +ENCODING 364 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +1040 +18C0 +0F80 +0000 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +E070 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 016D +ENCODING 365 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +2080 +3180 +1F00 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +E380 +7F80 +3D80 +ENDCHAR +STARTCHAR 016E +ENCODING 366 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +0700 +0880 +0880 +0880 +C730 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +E070 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 016F +ENCODING 367 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +1C00 +2200 +2200 +2200 +1C00 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +E380 +7F80 +3D80 +ENDCHAR +STARTCHAR 0170 +ENCODING 368 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 0 +BITMAP +0CC0 +1980 +1980 +0000 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +E070 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0171 +ENCODING 369 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +3300 +6600 +6600 +0000 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +E380 +7F80 +3D80 +ENDCHAR +STARTCHAR 0172 +ENCODING 370 +SWIDTH 720 0 +DWIDTH 16 0 +BBX 12 20 2 -4 +BITMAP +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +C030 +E070 +70E0 +3FC0 +1F80 +0100 +0200 +0200 +0380 +ENDCHAR +STARTCHAR 0173 +ENCODING 371 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 9 16 1 -4 +BITMAP +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +E380 +7F80 +3D80 +0100 +0200 +0200 +0380 +ENDCHAR +STARTCHAR 0174 +ENCODING 372 +SWIDTH 945 0 +DWIDTH 21 0 +BBX 21 20 0 0 +BITMAP +003000 +007800 +00CC00 +000000 +C07018 +C07018 +60D830 +60D830 +60D830 +60D830 +318C60 +318C60 +318C60 +318C60 +1B06C0 +1B06C0 +1B06C0 +1B06C0 +0E0380 +0E0380 +ENDCHAR +STARTCHAR 0175 +ENCODING 373 +SWIDTH 675 0 +DWIDTH 15 0 +BBX 15 16 0 0 +BITMAP +0180 +03C0 +0660 +0000 +C106 +C386 +C386 +628C +66CC +26C8 +36D8 +36D8 +1450 +1C70 +1C70 +0C60 +ENDCHAR +STARTCHAR 0176 +ENCODING 374 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 14 20 0 0 +BITMAP +0300 +0780 +0CC0 +0000 +E01C +6018 +3030 +3870 +1860 +0CC0 +0FC0 +0780 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 0177 +ENCODING 375 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 11 20 0 -4 +BITMAP +0600 +0F00 +1980 +0000 +C060 +C060 +60C0 +60C0 +30C0 +3180 +1980 +1980 +0F00 +0F00 +0700 +0600 +0E00 +0C00 +7C00 +7800 +ENDCHAR +STARTCHAR 0178 +ENCODING 376 +SWIDTH 630 0 +DWIDTH 14 0 +BBX 14 19 0 0 +BITMAP +0CC0 +0CC0 +0000 +E01C +6018 +3030 +3870 +1860 +0CC0 +0FC0 +0780 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 0179 +ENCODING 377 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 20 0 0 +BITMAP +0180 +0300 +0200 +0000 +7FF0 +7FF0 +0060 +00C0 +00C0 +0180 +0300 +0600 +0600 +0C00 +1800 +3000 +3000 +6000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 017A +ENCODING 378 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 16 0 0 +BITMAP +0300 +0600 +0400 +0000 +7FC0 +7FC0 +01C0 +0380 +0700 +0E00 +1C00 +3800 +7000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 017B +ENCODING 379 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 19 0 0 +BITMAP +0300 +0300 +0000 +7FF0 +7FF0 +0060 +00C0 +00C0 +0180 +0300 +0600 +0600 +0C00 +1800 +3000 +3000 +6000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 017C +ENCODING 380 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 15 0 0 +BITMAP +0600 +0600 +0000 +7FC0 +7FC0 +01C0 +0380 +0700 +0E00 +1C00 +3800 +7000 +E000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 017D +ENCODING 381 +SWIDTH 585 0 +DWIDTH 13 0 +BBX 12 20 0 0 +BITMAP +0CC0 +0780 +0300 +0000 +7FF0 +7FF0 +0060 +00C0 +00C0 +0180 +0300 +0600 +0600 +0C00 +1800 +3000 +3000 +6000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 017E +ENCODING 382 +SWIDTH 495 0 +DWIDTH 11 0 +BBX 10 16 0 0 +BITMAP +1980 +0F00 +0600 +0000 +7FC0 +7FC0 +01C0 +0380 +0700 +0E00 +1C00 +3800 +7000 +E000 +FFC0 +FFC0 +ENDCHAR +ENDFONT diff --git a/ESP32-S3_BLE_iOS_Media/code.py b/ESP32-S3_BLE_iOS_Media/code.py new file mode 100644 index 000000000..fcda43325 --- /dev/null +++ b/ESP32-S3_BLE_iOS_Media/code.py @@ -0,0 +1,210 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# SPDX-License-Identifier: MIT + +import time +import gc +import board +import displayio +import terminalio +import adafruit_ble +from adafruit_ble.advertising.standard import SolicitServicesAdvertisement +from adafruit_ble_apple_media import AppleMediaService +from adafruit_bitmap_font import bitmap_font +from adafruit_button import Button +from adafruit_display_text import label, wrap_text_to_lines +import adafruit_hx8357 +import adafruit_tsc2007 + +gc.collect() +displayio.release_displays() +small_font = bitmap_font.load_font("/Arial-16.bdf") + +# display +spi = board.SPI() +tft_cs = board.D9 +tft_dc = board.D10 +display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs) +display = adafruit_hx8357.HX8357(display_bus, width=480, height=320) +# touch +i2c = board.I2C() +tsc = adafruit_tsc2007.TSC2007(i2c, invert_x=True, swap_xy=True) +splash = displayio.Group() + +def ble_media_command(conn, command): + gc.collect() + # print("function started") + if not conn.paired: + print("trying to pair") + conn.pair() + print("paired") + # print("connected, getting ready") + ams = conn[AppleMediaService] + # print(ams) + tries = 10 + for i in range(tries): + try: + # print("sending..") + if command != "refresh": + command(ams) + time.sleep(2) + # print("sent") + song_text = f"{ams.title}" + song_text = "\n".join(wrap_text_to_lines(song_text, 29)) + song_label.text = song_text + album_label.text = f"Album: {ams.album}" + artist_label.text = f"Artist: {ams.artist}" + app_label.text = f"App: {ams.player_name}" + if ams.playing: + buttons[0].label = "Pause" + elif ams.paused: + buttons[0].label = "Play" + except Exception as error: # pylint: disable = broad-except + print(error) + # time.sleep(2) + if i < tries - 1: + continue + break + gc.collect() + +connection = None + +# commands +commands = [ + lambda ams: ams.toggle_play_pause(), + lambda ams: ams.next_track(), + lambda ams: ams.previous_track(), + lambda ams: ams.advance_repeat_mode(), + lambda ams: ams.advance_shuffle_mode(), + lambda ams: ams.volume_up(), + lambda ams: ams.volume_down(), +] + +# colors +RED = (255, 0, 0) +ORANGE = (255, 34, 0) +YELLOW = (255, 170, 0) +GREEN = (0, 255, 0) +CYAN = (0, 255, 255) +BLUE = (0, 0, 255) +VIOLET = (153, 0, 255) +MAGENTA = (255, 0, 51) +PINK = (255, 51, 119) +AQUA = (85, 125, 255) +WHITE = (255, 255, 255) +OFF = (0, 0, 0) + +gc.collect() +spots = [ + {'label': "Play/Pause", 'font': small_font, + 'pos': ((display.width // 2) - 60, display.height - 70), + 'size': (120, 60), 'color': RED, + 'control': lambda: ble_media_command(connection, commands[0])}, + {'label': ">>", 'font': small_font, + 'pos': ((display.width // 2) + 70, display.height - 70), + 'size': (60, 60), 'color': ORANGE, + 'control': lambda: ble_media_command(connection, commands[1])}, + {'label': "<<", 'font': small_font, + 'pos': ((display.width // 2) - 130, display.height - 70), + 'size': (60, 60), 'color': YELLOW, + 'control': lambda: ble_media_command(connection, commands[2])}, + {'label': "Repeat", 'font': terminalio.FONT, + 'pos': (10, 250), 'size': (60, 60), 'color': GREEN, + 'control': lambda: ble_media_command(connection, commands[3])}, + {'label': "Shuffle", 'font': terminalio.FONT, + 'pos': (410, 250), 'size': (60, 60), 'color': CYAN, + 'control': lambda: ble_media_command(connection, commands[4])}, + {'label': "Vol +", 'font': small_font, 'pos': (10, 10), 'size': (60, 120), 'color': BLUE, + 'control': lambda: ble_media_command(connection, commands[5])}, + {'label': "Vol -", 'font': small_font, 'pos': (410, 10), 'size': (60, 120), 'color': VIOLET, + 'control': lambda: ble_media_command(connection, commands[6])}, + {'label': "Refresh", 'font': small_font, 'pos': (70, 10), 'size': (340, display.height - 80), + 'color': None, 'control': lambda: ble_media_command(connection, "refresh")}, + ] + +buttons = [] +for spot in spots: + button = Button(x=spot['pos'][0], y=spot['pos'][1], + width=spot['size'][0], height=spot['size'][1], + label=spot['label'], label_font=spot['font'], + style=Button.ROUNDRECT, + fill_color=spot['color'], + name=spot['label']) + splash.append(button) + buttons.append(button) + +header_label = label.Label(small_font, text="Now Playing:", color=WHITE) +header_label.anchor_point = (0.5, 0.0) +header_label.anchored_position = (display.width / 2, 10) +splash.append(header_label) + +song_label = label.Label(small_font, text=" ", color=WHITE) +song_label.anchor_point = (0.5, 0.0) +song_label.anchored_position = (display.width / 2, 40) +splash.append(song_label) +artist_label = label.Label(small_font, text="Artist: ", color=WHITE) +artist_label.anchor_point = (0.5, 0.0) +artist_label.anchored_position = (display.width / 2, 124) +splash.append(artist_label) +album_label = label.Label(small_font, text="Album: ", color=WHITE) +album_label.anchor_point = (0.5, 0.0) +album_label.anchored_position = (display.width / 2, 154) +splash.append(album_label) +app_label = label.Label(small_font, text="App: ", color=WHITE) +app_label.anchor_point = (0.5, 0.0) +app_label.anchored_position = (display.width / 2, 184) +splash.append(app_label) + +touch_state = False + +display.root_group = splash + +def scale_touch_coordinates(raw_x, raw_y): + # raw coordinate ranges + raw_x_min = 275 + raw_x_max = 3900 + raw_y_min = 487 + raw_y_max = 3800 + # scale the raw coordinates to display coordinates + display_x = (raw_x - raw_x_min) * display.width / (raw_x_max - raw_x_min) + display_y = (raw_y - raw_y_min) * display.height / (raw_y_max - raw_y_min) + # clamp values to ensure they stay within display bounds + display_x = max(0, min(display_x, display.width)) + display_y = max(0, min(display_y, display.height)) + return int(display_x), int(display_y) + +gc.collect() +# PyLint can't find BLERadio for some reason so special case it here. +radio = adafruit_ble.BLERadio() # pylint: disable=no-member +a = SolicitServicesAdvertisement() +a.solicited_services.append(AppleMediaService) +if not radio.connected: + print("advertising") + radio.start_advertising(a) +else: + print("already connected") + print(radio.connected) +print(gc.mem_free()) + +while True: + while not radio.connected: + pass + known_notifications = set() + while radio.connected: + if tsc.touched and not touch_state: + gc.collect() + touch_state = True + p = tsc.touch + point = scale_touch_coordinates(p["x"], p["y"]) + connection = radio.connections[0] + for button in buttons: + b = buttons.index(button) + if button.contains(point): + print(gc.mem_free()) + print("Touched", button.name) + spots[b]['control']() + if not tsc.touched and touch_state: + touch_state = False + print("disconnected") + print("advertising") + radio.start_advertising(a) + print("reconnected") diff --git a/Factory_Tests/Adafruit_MEMENTO_Factory_Test/.pycamera_s3.generate b/ESP32_S2_WiFi_Tests/JSONdemo/.none.test.only similarity index 100% rename from Factory_Tests/Adafruit_MEMENTO_Factory_Test/.pycamera_s3.generate rename to ESP32_S2_WiFi_Tests/JSONdemo/.none.test.only diff --git a/ESP32_S2_WiFi_Tests/JSONdemo/JSONdemo.ino b/ESP32_S2_WiFi_Tests/JSONdemo/JSONdemo.ino index 0e1b28b70..b6efae356 100644 --- a/ESP32_S2_WiFi_Tests/JSONdemo/JSONdemo.ino +++ b/ESP32_S2_WiFi_Tests/JSONdemo/JSONdemo.ino @@ -16,6 +16,7 @@ last revision November 2015 */ +#include #include #include #include @@ -44,16 +45,9 @@ char ssid[] = "YOUR_SSID"; // your network SSID (name) char pass[] = "YOUR_SSID_PASSWORD"; // your network password (use for WPA, or use as key for WEP) int keyIndex = 0; // your network key Index number (needed only for WEP) - -int status = WL_IDLE_STATUS; -// if you don't want to use DNS (and reduce your sketch size) -// use the numeric IP instead of the name for the server: -//IPAddress server(74,125,232,128); // numeric IP for Google (no DNS) - #define SERVER "cdn.syndication.twimg.com" #define PATH "/widgets/followbutton/info.json?screen_names=adafruit" - void setup() { //Initialize serial and wait for port to open: Serial.begin(115200); @@ -90,7 +84,6 @@ void setup() { display.display(); #endif - while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); diff --git a/ESP32_S2_WiFi_Tests/WiFiSSLClient/WiFiSSLClient.ino b/ESP32_S2_WiFi_Tests/WiFiSSLClient/WiFiSSLClient.ino index 1fdc29cf2..de37b3b59 100644 --- a/ESP32_S2_WiFi_Tests/WiFiSSLClient/WiFiSSLClient.ino +++ b/ESP32_S2_WiFi_Tests/WiFiSSLClient/WiFiSSLClient.ino @@ -16,6 +16,7 @@ last revision November 2015 */ #include +#include // Enter your WiFi SSID and password char ssid[] = "YOUR_SSID"; // your network SSID (name) diff --git a/IoT_Button_BFF_Examples/adafruitIO_iotButtonNeoPixelBFF/.qtpy_esp32s2.test.only b/EYESPI/Arduino/Color/EYESPI_Test/.nrf52832.test.skip similarity index 100% rename from IoT_Button_BFF_Examples/adafruitIO_iotButtonNeoPixelBFF/.qtpy_esp32s2.test.only rename to EYESPI/Arduino/Color/EYESPI_Test/.nrf52832.test.skip diff --git a/Elgato_WiFi_Light_Controller/code.py b/Elgato_WiFi_Light_Controller/code.py new file mode 100644 index 000000000..0c9786794 --- /dev/null +++ b/Elgato_WiFi_Light_Controller/code.py @@ -0,0 +1,241 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import os +import ssl +import wifi +import socketpool +import board +import digitalio +import displayio +import adafruit_requests +from adafruit_bitmap_font import bitmap_font +from adafruit_display_shapes.circle import Circle +from adafruit_display_text import bitmap_label +from adafruit_seesaw import seesaw, rotaryio, digitalio as seesaw_digitalio, neopixel +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff + +num_lights = 1 +light = os.getenv('ELGATO_LIGHT') +clock_clock = ticks_ms() +clock_timer = 3 * 1000 + +i2c = board.I2C() # uses board.SCL and board.SDA +seesaw = seesaw.Seesaw(i2c, addr=0x36) +encoder = rotaryio.IncrementalEncoder(seesaw) +seesaw.pin_mode(24, seesaw.INPUT_PULLUP) +switch = seesaw_digitalio.DigitalIO(seesaw, 24) +switch_state = False +pixel = neopixel.NeoPixel(seesaw, 6, 1) +pixel.brightness = 0.2 +pixel.fill((255, 0, 0)) +print() +print("Connecting to WiFi") +# connect to your SSID +try: + wifi.radio.connect(os.getenv('CIRCUITPY_WIFI_SSID'), os.getenv('CIRCUITPY_WIFI_PASSWORD')) +# pylint: disable = broad-except +except Exception: + wifi.radio.connect(os.getenv('WIFI_SSID'), os.getenv('WIFI_PASSWORD')) +print("Connected to WiFi") +pixel.fill((0, 0, 255)) + +pool = socketpool.SocketPool(wifi.radio) +requests = adafruit_requests.Session(pool, ssl.create_default_context()) + +# buttons +button0 = digitalio.DigitalInOut(board.D0) +button0.direction = digitalio.Direction.INPUT +button0.pull = digitalio.Pull.UP +button0_state = False +button1 = digitalio.DigitalInOut(board.D1) +button1.direction = digitalio.Direction.INPUT +button1.pull = digitalio.Pull.DOWN +button1_state = False +button2 = digitalio.DigitalInOut(board.D2) +button2.direction = digitalio.Direction.INPUT +button2.pull = digitalio.Pull.DOWN +button2_state = False + +group = displayio.Group() +board.DISPLAY.root_group = group + +# font for graphics +sm_file = "/roundedHeavy-26.bdf" +sm_font = bitmap_font.load_font(sm_file) +# font for text only +lg_file = "/roundedHeavy-46.bdf" +lg_font = bitmap_font.load_font(lg_file) +http_text = bitmap_label.Label(sm_font, text=" ") +http_text.anchor_point = (1.0, 0.0) +http_text.anchored_position = (board.DISPLAY.width, 0) +group.append(http_text) +status_text = bitmap_label.Label(sm_font, text=" ") +status_text.anchor_point = (0.0, 0.5) +status_text.anchored_position = (0, board.DISPLAY.height / 2) +group.append(status_text) +temp_text = bitmap_label.Label(lg_font, text=" K") +temp_text.anchor_point = (1.0, 0.5) +temp_text.anchored_position = (board.DISPLAY.width, board.DISPLAY.height / 2) +group.append(temp_text) +bright_text = bitmap_label.Label(lg_font, text=" %", x=board.DISPLAY.width//2, y=90) +bright_text.anchor_point = (1.0, 1.0) +bright_text.anchored_position = (board.DISPLAY.width, board.DISPLAY.height - 15) +group.append(bright_text) +onOff_circ = Circle(12, 12, 10, fill=None, stroke = 2, outline = 0xcccc00) +group.append(onOff_circ) + +def kelvin_to_elgato(value): + t = value * 0.05 + t = max(min(344, int(t)), 143) + return t + +def elgato_to_kelvin(value): + t = value / 0.05 + return t + +def ctrl_light(b, t, onOff): + url = f"http://{light}:9123/elgato/lights" + json = {"numberOfLights":num_lights,"lights":[{"on":onOff,"brightness":b,"temperature":t}]} + print(f"PUTting data to {url}: {json}") + status_text.text = "sending.." + for i in range(5): + try: + pixel.fill((0, 255, 0)) + r = requests.request(method="PUT", url=url, data=None, json=json, + headers = {'Content-Type': 'application/json'}, timeout=10) + print("-" * 40) + print(r.status_code) + # if PUT fails, try again + if r.status_code != 200: + status_text.text = "..sending.." + pixel.fill((255, 255, 0)) + time.sleep(2) + r = requests.request(method="PUT", url=url, data=None, json=json, + headers = {'Content-Type': 'application/json'}, timeout=10) + if r.status_code != 200: + pixel.fill((255, 0, 0)) + except Exception: + pixel.fill((255, 0, 0)) + time.sleep(2) + if i < 5 - 1: + continue + raise + break + status_text.text = "sent!" + light_indicator(onOff) + pixel.fill((255, 0, 255)) + +def read_light(): + status_text.text = "reading.." + for i in range(5): + try: + pixel.fill((0, 255, 0)) + r = requests.get(f"http://{light}:9123/elgato/lights") + j = r.json() + if r.status_code != 200: + status_text.text = "..reading.." + pixel.fill((255, 255, 0)) + time.sleep(2) + r = requests.get(f"http://{light}:9123/elgato/lights") + j = r.json() + if r.status_code != 200: + pixel.fill((255, 0, 0)) + except Exception: + pixel.fill((255, 0, 0)) + time.sleep(2) + if i < 5 - 1: + continue + raise + break + status_text.text = "read!" + pixel.fill((255, 0, 255)) + onOff = j['lights'][0]['on'] + light_indicator(onOff) + b = round(j['lights'][0]['brightness'] / 10) * 10 + bright_text.text = f"{b}%" + t = j['lights'][0]['temperature'] + color_t = round(elgato_to_kelvin(t) / 100) * 100 + temp_text.text = f"{color_t}K" + return b, color_t, t, onOff + +def light_indicator(onOff): + if onOff: + onOff_circ.fill = 0xcccc00 + else: + onOff_circ.fill = None + +selected_light = 0 +adjust_temp = True +last_position = 0 + +http_text.text = f"{light}" +# get on/off state of light on start-up +try: + brightness, color_temp, temp, light_on = read_light() +except Exception: + print() + print("Could not find your Elgato light on the network..") + print("Make sure it is powered on and that its IP address is correct in settings.toml.") + print() + raise + +while True: + position = encoder.position + # reset button state on release + if not switch.value and switch_state: + switch_state = False + if button0.value and button0_state: + button0_state = False + if not button1.value and button1_state: + button1_state = False + if not button2.value and button2_state: + button2_state = False + + if position != last_position: + if position > last_position: + if adjust_temp: + color_temp = color_temp + 100 + color_temp = max(min(7000, color_temp), 2900) + temp_text.text = f"{color_temp}K" + else: + brightness = brightness + 10 + brightness = max(min(100, brightness), 10) + bright_text.text = f"{brightness}%" + else: + if adjust_temp: + color_temp = color_temp - 100 + color_temp = max(min(7000, color_temp), 2900) + temp_text.text = f"{color_temp}K" + else: + brightness = brightness - 10 + brightness = max(min(100, brightness), 10) + bright_text.text = f"{brightness}%" + temp = kelvin_to_elgato(color_temp) + last_position = position + # switch between adjusting color temp or brightness + if switch.value and not switch_state: + switch_state = True + adjust_temp = not adjust_temp + # toggle light on/off + if not button0.value and not button0_state: + button0_state = True + light_on = not light_on + ctrl_light(brightness, temp, light_on) + clock_clock = ticks_add(clock_clock, clock_timer) + # update brightness/temp + if button1.value and not button1_state: + button1_state = True + light_on = True + ctrl_light(brightness, temp, light_on) + clock_clock = ticks_add(clock_clock, clock_timer) + # check values + if button2.value and not button2_state: + button2_state = True + brightness, color_temp, temp, light_on = read_light() + clock_clock = ticks_add(clock_clock, clock_timer) + if ticks_diff(ticks_ms(), clock_clock) >= clock_timer: + status_text.text = "Connected" + clock_clock = ticks_add(clock_clock, clock_timer) diff --git a/Elgato_WiFi_Light_Controller/roundedHeavy-26.bdf b/Elgato_WiFi_Light_Controller/roundedHeavy-26.bdf new file mode 100644 index 000000000..eeccb2f53 --- /dev/null +++ b/Elgato_WiFi_Light_Controller/roundedHeavy-26.bdf @@ -0,0 +1,7673 @@ +STARTFONT 2.1 +FONT -FontForge-Ostrich Sans-Heavy-R-Normal-Sans-26-250-75-75--94-- +SIZE 25 75 75 +FONTBOUNDINGBOX 19 29 -3 -6 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +COMMENT "Copyright (c) 2013 by The League of Moveable Type. All rights reserved." +STARTPROPERTIES 39 +FOUNDRY "FontForge" +FAMILY_NAME "Ostrich Sans" +WEIGHT_NAME "Heavy" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "Sans" +PIXEL_SIZE 26 +POINT_SIZE 250 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "" +AVERAGE_WIDTH 0 +CHARSET_REGISTRY "" +CHARSET_ENCODING "" +FONTNAME_REGISTRY "" +CHARSET_COLLECTIONS "ISO10646-1" +FONT_NAME "OstrichSans-Heavy" +FACE_NAME "Ostrich Sans Heavy" +COPYRIGHT "Copyright (c) 2013 by The League of Moveable Type. All rights reserved." +FONT_VERSION "001.001" +FONT_ASCENT 21 +FONT_DESCENT 5 +UNDERLINE_POSITION -2 +UNDERLINE_THICKNESS 2 +X_HEIGHT 17 +CAP_HEIGHT 17 +RAW_ASCENT 800 +RAW_DESCENT 200 +NORM_SPACE 5 +RELATIVE_WEIGHT 90 +RELATIVE_SETWIDTH 50 +SUPERSCRIPT_X 0 +SUPERSCRIPT_Y 9 +SUPERSCRIPT_SIZE 15 +SUBSCRIPT_X 0 +SUBSCRIPT_Y 1 +SUBSCRIPT_SIZE 15 +AVG_LOWERCASE_WIDTH 101 +AVG_UPPERCASE_WIDTH 101 +ENDPROPERTIES +CHARS 310 +STARTCHAR CR +ENCODING 13 +SWIDTH 210 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 210 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 143 0 +DWIDTH 4 0 +BBX 2 18 0 0 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 212 0 +DWIDTH 6 0 +BBX 4 4 0 14 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 592 0 +DWIDTH 15 0 +BBX 14 17 -1 0 +BITMAP +0330 +0730 +0770 +0770 +0770 +7FFC +7FFC +0EE0 +0EE0 +7FF8 +FFF8 +7FF8 +1DC0 +1DC0 +1DC0 +1980 +1980 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 21 0 -2 +BITMAP +1C00 +1C00 +7E00 +7F00 +E700 +E380 +E380 +E300 +7000 +7800 +3E00 +0F00 +0700 +E300 +E380 +E380 +FF00 +7F00 +3E00 +1C00 +1800 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 554 0 +DWIDTH 14 0 +BBX 14 17 0 0 +BITMAP +7860 +FCE0 +FCE0 +FDC0 +FDC0 +FD80 +7B80 +3380 +0700 +0778 +06FC +0EFC +0EFC +1CFC +1CFC +18F8 +3878 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 479 0 +DWIDTH 12 0 +BBX 10 18 0 0 +BITMAP +0800 +3E00 +3E00 +7700 +7700 +3700 +3E00 +3E00 +3C00 +7CC0 +7FC0 +EFC0 +E7C0 +C3C0 +E380 +FFC0 +7FC0 +3EC0 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 131 0 +DWIDTH 3 0 +BBX 2 4 0 14 +BITMAP +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 216 0 +DWIDTH 6 0 +BBX 4 17 0 0 +BITMAP +30 +70 +60 +E0 +E0 +E0 +C0 +C0 +C0 +C0 +E0 +E0 +E0 +E0 +70 +70 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 208 0 +DWIDTH 5 0 +BBX 4 17 0 0 +BITMAP +E0 +E0 +70 +70 +30 +30 +30 +30 +30 +30 +30 +30 +70 +70 +60 +E0 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 345 0 +DWIDTH 9 0 +BBX 8 7 0 10 +BITMAP +18 +5E +FF +FE +7C +7E +64 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 434 0 +DWIDTH 11 0 +BBX 9 9 0 4 +BITMAP +0C00 +1C00 +1C00 +FF80 +FF80 +7F80 +1C00 +1C00 +0C00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 135 0 +DWIDTH 4 0 +BBX 3 4 0 -1 +BITMAP +C0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 349 0 +DWIDTH 9 0 +BBX 8 3 0 7 +BITMAP +FE +FF +7E +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 131 0 +DWIDTH 3 0 +BBX 3 3 0 0 +BITMAP +C0 +E0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 434 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +0100 +0380 +0380 +0300 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +3000 +7000 +7000 +E000 +E000 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 370 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +10 +7C +FE +E6 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +E6 +FE +7E +3C +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 244 0 +DWIDTH 6 0 +BBX 5 18 0 0 +BITMAP +10 +38 +78 +F8 +F8 +78 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 370 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +10 +7C +7E +E7 +E7 +E7 +07 +0E +0E +1C +3C +78 +70 +E0 +E0 +FE +FF +FF +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 8 18 0 0 +BITMAP +10 +7C +7E +E6 +E7 +E7 +47 +0E +3E +3C +1E +06 +E7 +E7 +E7 +FE +7E +3C +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 374 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +02 +07 +07 +0F +0F +1F +1F +3F +37 +77 +E7 +FF +FF +07 +07 +07 +07 +03 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 360 0 +DWIDTH 9 0 +BBX 8 18 0 0 +BITMAP +FE +FF +FE +E0 +E0 +E0 +F8 +FE +FE +E7 +E7 +47 +07 +E7 +E7 +EE +FE +7C +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 362 0 +DWIDTH 9 0 +BBX 8 18 0 0 +BITMAP +18 +7E +7E +E6 +E7 +E6 +F8 +FE +FE +E6 +E7 +E7 +E7 +E7 +E6 +FE +7E +3C +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 426 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +7F80 +FFC0 +FF80 +0380 +0380 +0700 +0700 +0600 +0E00 +0E00 +1C00 +1C00 +3800 +3800 +3000 +7000 +7000 +6000 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 382 0 +DWIDTH 10 0 +BBX 8 17 0 0 +BITMAP +7E +FF +E7 +E7 +E7 +E7 +E7 +7F +7E +FF +E7 +E7 +E7 +E7 +FF +7E +3C +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 358 0 +DWIDTH 9 0 +BBX 8 17 0 0 +BITMAP +7C +7E +EE +E7 +E7 +E7 +E7 +E7 +EF +7F +7F +07 +E7 +E6 +FE +7E +7C +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 163 0 +DWIDTH 4 0 +BBX 3 10 0 4 +BITMAP +C0 +E0 +E0 +40 +00 +00 +C0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 147 0 +DWIDTH 4 0 +BBX 3 11 0 3 +BITMAP +C0 +E0 +E0 +C0 +00 +00 +00 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 292 0 +DWIDTH 8 0 +BBX 6 9 0 5 +BITMAP +0C +3C +78 +F0 +E0 +F0 +78 +3C +1C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 362 0 +DWIDTH 9 0 +BBX 8 8 0 4 +BITMAP +FE +FF +FE +00 +00 +FE +FF +FE +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 292 0 +DWIDTH 8 0 +BBX 6 9 0 5 +BITMAP +C0 +E0 +78 +3C +1C +3C +78 +F0 +E0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 8 17 0 0 +BITMAP +7C +7E +E7 +E7 +E7 +C7 +0E +0E +1C +18 +38 +38 +38 +00 +30 +38 +30 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 697 0 +DWIDTH 18 0 +BBX 16 17 0 0 +BITMAP +01C0 +0FF8 +1FFC +3C1E +798E +77E6 +6FE7 +EEE7 +ECE7 +EFEE +EFFE +E7FC +7070 +780E +3FFE +0FFC +03E0 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 386 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +70 +FE +FF +E7 +E7 +E7 +E7 +E7 +FE +FE +FF +E7 +E7 +E7 +E7 +FF +FE +FC +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +70 +FE +FF +E7 +E7 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E7 +FF +FE +FC +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 18 0 0 +BITMAP +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 358 0 +DWIDTH 9 0 +BBX 7 18 0 0 +BITMAP +FE +FE +FE +E0 +E0 +E0 +E0 +E0 +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +42 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +FF +FF +FF +E7 +E7 +E7 +E7 +E7 +E7 +E3 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 164 0 +DWIDTH 4 0 +BBX 3 18 0 0 +BITMAP +40 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 374 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +02 +07 +07 +07 +07 +07 +07 +07 +07 +07 +07 +07 +C7 +C7 +E7 +FE +7E +3C +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 388 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +4100 +E380 +E700 +E700 +EE00 +EE00 +FC00 +F800 +F800 +F800 +F800 +FC00 +FE00 +EE00 +E700 +E700 +E380 +C380 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 7 18 0 0 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +FE +FE +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 443 0 +DWIDTH 12 0 +BBX 9 18 0 0 +BITMAP +4100 +E180 +E380 +E380 +E380 +E380 +F380 +F780 +F780 +F780 +F780 +FF80 +FF80 +FD80 +FD80 +FD80 +FD80 +CD80 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 390 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +FC +FE +FF +E7 +E3 +E3 +E3 +E7 +FF +FE +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +3C00 +7F00 +FF00 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +EF00 +EF00 +7F00 +7F80 +0380 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 401 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +FF00 +FF80 +7F00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +0800 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 18 0 0 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 435 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +E1C0 +E1C0 +E1C0 +6180 +7380 +7380 +7380 +3300 +3700 +3F00 +3F00 +1E00 +1E00 +1E00 +1E00 +1C00 +0C00 +0C00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 18 0 0 +BITMAP +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +4080 +E1C0 +E180 +7380 +7300 +3700 +3E00 +3E00 +1E00 +1C00 +1E00 +3E00 +3F00 +7700 +7380 +E380 +E1C0 +C1C0 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 411 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 430 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +4000 +E000 +6000 +7000 +7000 +3800 +3800 +1C00 +1C00 +1C00 +0E00 +0E00 +0700 +0700 +0700 +0380 +0380 +0180 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 237 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +30 +78 +FC +CC +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 511 0 +DWIDTH 13 0 +BBX 12 3 0 -1 +BITMAP +FFE0 +FFF0 +7FE0 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +E0 +F0 +7C +1C +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 386 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +70 +FE +FF +E7 +E7 +E7 +E7 +E7 +FE +FE +FF +E7 +E7 +E7 +E7 +FF +FE +FC +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +70 +FE +FF +E7 +E7 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E7 +FF +FE +FC +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 18 0 0 +BITMAP +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 358 0 +DWIDTH 9 0 +BBX 7 18 0 0 +BITMAP +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +42 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +FF +FF +FF +E7 +E7 +E7 +E7 +E7 +E7 +E3 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 164 0 +DWIDTH 4 0 +BBX 3 18 0 0 +BITMAP +40 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 374 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +02 +07 +07 +07 +07 +07 +07 +07 +07 +07 +07 +07 +C7 +C7 +E7 +FE +7E +3C +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +4100 +E380 +E700 +E700 +EE00 +EE00 +FC00 +F800 +F800 +F800 +F800 +FC00 +FE00 +EE00 +E700 +E700 +E380 +C380 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 7 18 0 0 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +FE +FE +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 443 0 +DWIDTH 12 0 +BBX 9 18 0 0 +BITMAP +4100 +E180 +E380 +E380 +E380 +E380 +F380 +F780 +F780 +F780 +F780 +FF80 +FF80 +FD80 +FD80 +FD80 +FD80 +CD80 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 390 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +70 +FE +FF +E7 +E3 +E3 +E3 +E7 +FF +FE +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 19 0 -1 +BITMAP +0800 +7E00 +FF00 +E700 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +EF00 +FF00 +7F00 +3F80 +0180 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 17 0 0 +BITMAP +FE00 +FF00 +E700 +E380 +E380 +E380 +E700 +FF00 +FE00 +FF00 +E700 +E300 +E300 +E300 +E300 +E300 +E300 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +7000 +7800 +3E00 +0F00 +0700 +E300 +E380 +E380 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 401 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +7F00 +FF80 +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 18 0 0 +BITMAP +40 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +FF +7F +3C +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 435 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +4080 +E1C0 +E1C0 +6180 +6380 +7380 +7380 +7300 +3300 +3F00 +3F00 +3F00 +1E00 +1E00 +1E00 +1E00 +0C00 +0C00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 555 0 +DWIDTH 14 0 +BBX 13 18 0 0 +BITMAP +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +4080 +E1C0 +E180 +7380 +7300 +3700 +3E00 +3E00 +1E00 +1C00 +1E00 +3E00 +3F00 +7700 +7380 +E380 +E1C0 +C1C0 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 411 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 139 0 +DWIDTH 4 0 +BBX 3 18 0 0 +BITMAP +40 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 322 0 +DWIDTH 8 0 +BBX 8 3 0 17 +BITMAP +7F +FF +FE +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 143 0 +DWIDTH 4 0 +BBX 2 17 0 0 +BITMAP +C0 +C0 +C0 +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 373 0 +DWIDTH 10 0 +BBX 9 17 0 0 +BITMAP +3E00 +3F00 +7300 +7200 +7000 +7000 +7000 +FE00 +FE00 +7E00 +7000 +7000 +7000 +6000 +FF00 +FF80 +FF00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 229 0 +DWIDTH 6 0 +BBX 6 3 0 19 +BITMAP +DC +DC +DC +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 709 0 +DWIDTH 18 0 +BBX 16 18 0 0 +BITMAP +03E0 +0FF8 +1FFC +3C1E +7BCE +77E7 +67E7 +E773 +E763 +E703 +E773 +E773 +67E7 +73E7 +39CE +3FFC +0FF8 +03E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 723 0 +DWIDTH 19 0 +BBX 16 18 0 0 +BITMAP +03E0 +0FF8 +1FFC +3C1E +73CE +73E7 +63E7 +E363 +E3E3 +E3E3 +E3E3 +6363 +7367 +736E +381E +1FFC +0FF8 +03E0 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 231 0 +DWIDTH 6 0 +BBX 6 3 0 18 +BITMAP +FC +FC +78 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 142 0 +DWIDTH 4 0 +BBX 4 3 0 17 +BITMAP +E0 +B0 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 247 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +08 +3C +F8 +E0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 83 0 +DWIDTH 2 0 +BBX 2 3 0 8 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 201 0 +DWIDTH 5 0 +BBX 5 7 0 -6 +BITMAP +40 +60 +78 +78 +98 +F8 +F0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 140 0 +DWIDTH 4 0 +BBX 4 3 0 17 +BITMAP +E0 +B0 +E0 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 8 17 -1 0 +BITMAP +0C +0C +0C +0C +0C +0C +1C +1C +38 +70 +70 +63 +E3 +E7 +77 +7E +3E +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +3C00 +1E00 +0700 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +0F00 +1E00 +3C00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1E00 +1F00 +3F00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1800 +7F80 +7F80 +0700 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1200 +3F00 +3F00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1E00 +1200 +1E00 +0000 +0000 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 665 0 +DWIDTH 17 0 +BBX 15 18 0 0 +BITMAP +00FC +01FE +01FE +03C0 +03C0 +07C0 +07C0 +0FC0 +0FFE +1DFE +1DFC +1FC0 +3FC0 +31C0 +71C0 +71FC +E1FE +E1FE +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 23 0 -5 +BITMAP +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +1800 +1E00 +1F00 +3F00 +3E00 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 23 0 0 +BITMAP +70 +7C +1E +06 +00 +FE +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +1E +3C +70 +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +38 +7C +7E +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +24 +6E +6E +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -1 0 +BITMAP +E0 +78 +3C +00 +20 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +60 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 5 22 -1 0 +BITMAP +38 +F8 +E0 +00 +20 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +60 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -2 0 +BITMAP +38 +7C +FC +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -2 0 +BITMAP +44 +EC +EC +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 10 18 -2 0 +BITMAP +1C00 +3F80 +3FC0 +39C0 +39C0 +38C0 +38C0 +38C0 +FEC0 +FEC0 +7EC0 +38C0 +38C0 +38C0 +39C0 +3FC0 +3F80 +3F00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +7F80 +FF00 +0E00 +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +3E00 +0F00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1E00 +3C00 +7800 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +7F00 +FF00 +0E00 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +2200 +7600 +7600 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 294 0 +DWIDTH 8 0 +BBX 6 6 0 6 +BITMAP +CC +FC +7C +78 +FC +EC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +0900 +7F80 +7F80 +E700 +E700 +E780 +EF80 +EF80 +FF80 +FF80 +FB80 +FB80 +FB80 +F380 +F300 +FF00 +FF00 +FC00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +30 +3C +1E +06 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +06 +1E +3C +30 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +18 +3C +7E +7E +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +76 +76 +76 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +3800 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 386 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +C000 +C000 +C000 +C000 +FC00 +FF00 +FF80 +C380 +C180 +C180 +C380 +FF80 +FF00 +F800 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 376 0 +DWIDTH 10 0 +BBX 8 17 0 0 +BITMAP +3C +7E +FE +E6 +C7 +C6 +C6 +CE +DE +DE +C7 +C3 +C3 +C3 +CF +DF +DE +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +3C00 +1E00 +0700 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +0F00 +1E00 +3C00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1E00 +1F00 +3F00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1800 +7F80 +7F80 +0700 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1200 +3F00 +3F00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1E00 +1200 +1E00 +0000 +0000 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 665 0 +DWIDTH 17 0 +BBX 14 17 0 0 +BITMAP +01FC +01FC +03FC +03C0 +07C0 +07C0 +07C0 +0FFC +0DFC +1DFC +1FC0 +3FC0 +39C0 +71C0 +71C0 +E1FC +E1FC +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 23 0 -5 +BITMAP +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +1800 +1E00 +1F00 +3F00 +3E00 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 23 0 0 +BITMAP +70 +7C +1E +06 +00 +FE +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +1E +3C +70 +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +38 +7C +7E +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +24 +6E +6E +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -1 0 +BITMAP +E0 +78 +3C +00 +20 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +60 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 5 22 -1 0 +BITMAP +38 +F8 +E0 +00 +20 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +60 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -2 0 +BITMAP +38 +7C +FC +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -2 0 +BITMAP +44 +EC +EC +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 10 17 -2 0 +BITMAP +3F00 +3F80 +3FC0 +39C0 +39C0 +39C0 +39C0 +FFC0 +FFC0 +FFC0 +39C0 +39C0 +39C0 +39C0 +3BC0 +3F80 +3F00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +7F80 +FF00 +0E00 +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +3E00 +0F00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +3800 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +7F00 +FF00 +0E00 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +2200 +7600 +7600 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 163 0 +DWIDTH 4 0 +BBX 3 10 0 4 +BITMAP +C0 +E0 +E0 +40 +00 +00 +C0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +0900 +7F80 +7F80 +E700 +E700 +E780 +EF80 +EF80 +FF80 +FF80 +FB80 +FB80 +FB80 +F380 +F300 +FF00 +FF00 +FC00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +30 +3C +1E +06 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +06 +1E +3C +30 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +18 +3C +7E +7E +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +76 +76 +76 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +3800 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 386 0 +DWIDTH 10 0 +BBX 9 17 0 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +FF00 +FF80 +C380 +C180 +C380 +FF80 +FF00 +F800 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +2200 +7600 +7600 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 21 0 0 +BITMAP +3F00 +3F00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 21 0 0 +BITMAP +3F00 +3F00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +3800 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +3800 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 21 0 0 +BITMAP +1C00 +1C00 +0800 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 21 0 0 +BITMAP +1C00 +1C00 +0800 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +7E00 +3E00 +1C00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +7E00 +3E00 +1C00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 8 22 0 0 +BITMAP +7E +7C +38 +00 +70 +FE +FF +E7 +E7 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E7 +FF +FE +FC +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 8 22 0 0 +BITMAP +7E +7C +38 +00 +70 +FE +FF +E7 +E7 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E7 +FF +FE +FC +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 418 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +3800 +7F00 +7F80 +7380 +71C0 +71C0 +71C0 +71C0 +FDC0 +FDC0 +F9C0 +71C0 +71C0 +71C0 +7180 +7F80 +7F80 +3E00 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 418 0 +DWIDTH 11 0 +BBX 9 17 0 0 +BITMAP +3E00 +3F00 +3F80 +3180 +3180 +3180 +3180 +FD80 +FD80 +FD80 +3180 +3180 +3180 +3180 +3780 +3F80 +3E00 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 21 0 0 +BITMAP +7E +7E +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 21 0 0 +BITMAP +7E +7E +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +6E +7E +7C +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +6E +7E +7C +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 21 0 0 +BITMAP +18 +18 +10 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 21 0 0 +BITMAP +18 +18 +10 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +7E +7C +38 +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +7E +7C +38 +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +7600 +7E00 +3E00 +0000 +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +7600 +7E00 +3E00 +0000 +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 21 0 0 +BITMAP +1C00 +1C00 +0800 +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 21 0 0 +BITMAP +1C00 +1C00 +0800 +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 22 0 -5 +BITMAP +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +E700 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +0000 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 22 0 -5 +BITMAP +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +E700 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +0000 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 8 22 0 0 +BITMAP +3C +3E +7E +00 +42 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +FF +FF +FF +E7 +E7 +E7 +E7 +E7 +E7 +E3 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 8 22 0 0 +BITMAP +3C +3E +7E +00 +42 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +FF +FF +FF +E7 +E7 +E7 +E7 +E7 +E7 +E3 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 8 22 -3 0 +BITMAP +30 +FF +FF +0C +08 +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +18 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 8 22 -3 0 +BITMAP +30 +FF +FF +0C +08 +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +18 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 21 -2 0 +BITMAP +FC +FC +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 21 -2 0 +BITMAP +FC +FC +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -2 0 +BITMAP +EC +FC +7C +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -2 0 +BITMAP +EC +FC +7C +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 3 21 0 0 +BITMAP +E0 +E0 +40 +40 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 3 17 0 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 374 0 +DWIDTH 10 0 +BBX 10 22 0 0 +BITMAP +0780 +0F80 +0FC0 +0000 +0200 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +C700 +C700 +E700 +FE00 +7E00 +3C00 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 374 0 +DWIDTH 10 0 +BBX 10 22 0 0 +BITMAP +0780 +0F80 +0FC0 +0000 +0200 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +C700 +C700 +E700 +FE00 +7E00 +3C00 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 388 0 +DWIDTH 10 0 +BBX 9 23 0 -5 +BITMAP +4100 +E380 +E700 +E700 +EE00 +EE00 +FC00 +F800 +F800 +F800 +F800 +FC00 +FE00 +EE00 +E700 +E700 +E380 +C380 +0000 +1800 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 388 0 +DWIDTH 10 0 +BBX 9 23 0 -5 +BITMAP +4100 +E380 +E700 +E700 +EE00 +EE00 +FC00 +F800 +F800 +F800 +F800 +FC00 +FE00 +EE00 +E700 +E700 +E380 +C380 +0000 +1800 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 9 22 -2 0 +BITMAP +3C00 +7800 +F000 +0000 +1000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3F00 +3F80 +3F80 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 9 22 -2 0 +BITMAP +3C00 +7800 +F000 +0000 +1000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3F00 +3F80 +3F80 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 7 23 0 -5 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +FE +FE +00 +38 +38 +38 +38 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 7 23 0 -5 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +FE +FE +00 +38 +38 +38 +38 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 9 20 -2 1 +BITMAP +CC00 +FC00 +7800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3F80 +3F80 +3F80 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 414 0 +DWIDTH 11 0 +BBX 11 17 -2 0 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1F80 +1F80 +1F00 +1E00 +3C00 +7C00 +FC00 +FC00 +1C00 +1FC0 +1FE0 +1FE0 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 414 0 +DWIDTH 11 0 +BBX 10 17 -2 0 +BITMAP +0800 +1C00 +1C00 +1C00 +1C00 +1D00 +1F80 +1F00 +1E00 +1C00 +3C00 +7C00 +FC00 +5C00 +1C00 +1FC0 +1FC0 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1E00 +3C00 +7800 +0000 +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1E00 +3C00 +7800 +0000 +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 23 0 -5 +BITMAP +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +0000 +0C00 +1C00 +1C00 +0C00 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 23 0 -5 +BITMAP +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +0000 +0C00 +1C00 +1C00 +0C00 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +7E00 +3E00 +1C00 +0000 +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +7E00 +3E00 +1C00 +0000 +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 21 0 0 +BITMAP +7E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 21 0 0 +BITMAP +7E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +7600 +7E00 +3E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +7600 +7E00 +3E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 544 0 +DWIDTH 14 0 +BBX 12 18 0 0 +BITMAP +07E0 +3FF0 +7FF0 +7E00 +EE00 +EE00 +EE00 +EE00 +EFF0 +EFF0 +EFE0 +EE00 +EE00 +EE00 +EE00 +7FE0 +7FF0 +1FF0 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 544 0 +DWIDTH 14 0 +BBX 12 17 0 0 +BITMAP +1FE0 +3FF0 +7FE0 +6E00 +EE00 +EE00 +EE00 +EFE0 +EFF0 +EFE0 +EE00 +EE00 +EE00 +EE00 +7E00 +7FF0 +1FE0 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +0E00 +1E00 +7C00 +7000 +0000 +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +0E00 +1E00 +7C00 +7000 +0000 +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 22 0 -4 +BITMAP +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +0000 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 22 0 -4 +BITMAP +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +0000 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +6E00 +7E00 +3C00 +1800 +0000 +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +6E00 +7E00 +3C00 +1800 +0000 +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +0600 +1E00 +7C00 +7000 +0000 +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +0600 +1E00 +7C00 +7000 +0000 +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +1C00 +3C00 +7E00 +7600 +0000 +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +1C00 +3C00 +7E00 +7600 +0000 +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 -5 +BITMAP +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +1800 +1800 +1E00 +0F00 +3F00 +1E00 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 -5 +BITMAP +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +1800 +1800 +1E00 +0F00 +3F00 +1E00 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +3600 +3E00 +3C00 +1C00 +0000 +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +3600 +3E00 +3C00 +1C00 +0000 +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 401 0 +DWIDTH 10 0 +BBX 9 22 0 -4 +BITMAP +FF00 +FF80 +7F00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +0800 +0000 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 401 0 +DWIDTH 10 0 +BBX 9 22 0 -4 +BITMAP +FF00 +FF80 +7F00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +0800 +0000 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 401 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +3600 +3E00 +3C00 +1C00 +0000 +FF00 +FF80 +7F00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +0800 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 401 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +3600 +3E00 +3C00 +1C00 +0000 +FF00 +FF80 +7F00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +0800 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +7B +FF +FE +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +30 +FF +FF +0C +40 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +FF +7F +3C +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +3E +7E +7E +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 21 0 0 +BITMAP +7E +7E +00 +40 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +FF +7F +3C +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +24 +7E +7E +3C +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +76 +7E +3E +00 +40 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +FF +7F +3C +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 1 +BITMAP +18 +3C +3C +18 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +3C +34 +3C +00 +41 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +FF +7F +3C +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0700 +0F80 +1D80 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0700 +0F80 +1D80 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +2200 +7600 +7600 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 411 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +7800 +0000 +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 411 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +7800 +0000 +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 411 0 +DWIDTH 11 0 +BBX 9 21 0 0 +BITMAP +1C00 +1C00 +0800 +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 411 0 +DWIDTH 11 0 +BBX 9 21 0 0 +BITMAP +1C00 +1C00 +0800 +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 419 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +7E00 +3E00 +1C00 +0000 +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 419 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +7E00 +3E00 +1C00 +0000 +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 665 0 +DWIDTH 17 0 +BBX 15 22 0 0 +BITMAP +00F0 +01E0 +0380 +0000 +00FC +01FE +01FE +03C0 +03C0 +07C0 +07C0 +0FC0 +0FFE +1DFE +1DFC +1FC0 +3FC0 +31C0 +71C0 +71FC +E1FE +E1FE +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 665 0 +DWIDTH 17 0 +BBX 15 22 0 0 +BITMAP +00F0 +01E0 +0380 +0000 +00FC +01FE +01FE +03C0 +03C0 +07C0 +07C0 +0FC0 +0FFE +1DFE +1DFC +1FC0 +3FC0 +31C0 +71C0 +71FC +E1FE +E1FE +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1E00 +3C00 +7800 +0000 +0900 +7F80 +7F80 +FF00 +FF00 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF00 +FF00 +FF00 +FC00 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +0900 +7F80 +7F80 +FF00 +FF00 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF00 +FF00 +FF00 +FC00 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 237 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +30 +78 +FC +DC +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 232 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +D8 +FC +78 +70 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 241 0 +DWIDTH 6 0 +BBX 6 3 0 19 +BITMAP +CC +FC +FC +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 82 0 +DWIDTH 2 0 +BBX 2 3 0 18 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 140 0 +DWIDTH 4 0 +BBX 4 3 0 19 +BITMAP +E0 +B0 +E0 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 319 0 +DWIDTH 8 0 +BBX 8 4 0 18 +BITMAP +70 +FF +FF +0E +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0E00 +0780 +03C0 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0E00 +0780 +03C0 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0380 +0F80 +0E00 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0380 +0F80 +0E00 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0880 +1D80 +1D80 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0880 +1D80 +1D80 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +3E00 +0F00 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +3E00 +0F00 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 349 0 +DWIDTH 9 0 +BBX 8 3 0 7 +BITMAP +FE +FF +7E +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 349 0 +DWIDTH 9 0 +BBX 8 3 0 7 +BITMAP +FE +FF +7E +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 131 0 +DWIDTH 3 0 +BBX 2 4 0 14 +BITMAP +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 131 0 +DWIDTH 3 0 +BBX 2 4 0 14 +BITMAP +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 200 0 +DWIDTH 5 0 +BBX 4 4 0 14 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 200 0 +DWIDTH 5 0 +BBX 4 4 0 14 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 155 0 +DWIDTH 4 0 +BBX 4 4 0 8 +BITMAP +40 +E0 +F0 +E0 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 260 0 +DWIDTH 7 0 +BBX 9 18 -1 0 +BITMAP +0100 +0380 +0700 +0700 +0600 +0E00 +0E00 +1C00 +1C00 +1800 +3800 +3800 +7000 +7000 +6000 +E000 +E000 +C000 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 370 0 +DWIDTH 10 0 +BBX 10 18 -1 0 +BITMAP +0400 +1F80 +3F80 +3F80 +7000 +7000 +7000 +FF00 +FF00 +7000 +7000 +FF00 +FF00 +7000 +3080 +3FC0 +3F80 +0F00 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 650 0 +DWIDTH 17 0 +BBX 16 8 0 10 +BITMAP +FE43 +FEE7 +38E7 +38EF +38FF +38DB +38DB +00C0 +ENDCHAR +STARTCHAR commaaccent +ENCODING 63171 +SWIDTH 260 0 +DWIDTH 7 0 +BBX 2 4 2 -5 +BITMAP +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Acute +ENCODING 63177 +SWIDTH 247 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +08 +3C +F8 +E0 +ENDCHAR +STARTCHAR Caron +ENCODING 63178 +SWIDTH 232 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +D8 +FC +78 +70 +ENDCHAR +STARTCHAR Dieresis +ENCODING 63179 +SWIDTH 229 0 +DWIDTH 6 0 +BBX 6 3 0 19 +BITMAP +DC +DC +DC +ENDCHAR +STARTCHAR Grave +ENCODING 63182 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +E0 +F0 +7C +1C +ENDCHAR +STARTCHAR Macron +ENCODING 63184 +SWIDTH 231 0 +DWIDTH 6 0 +BBX 6 3 0 18 +BITMAP +FC +FC +78 +ENDCHAR +STARTCHAR uniF8FF +ENCODING 63743 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR .notdef +ENCODING -1 +SWIDTH 210 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR Ring +ENCODING -1 +SWIDTH 140 0 +DWIDTH 4 0 +BBX 4 3 0 19 +BITMAP +E0 +B0 +E0 +ENDCHAR +STARTCHAR Tilde +ENCODING -1 +SWIDTH 319 0 +DWIDTH 8 0 +BBX 8 3 0 17 +BITMAP +7F +FF +FE +ENDCHAR +STARTCHAR Circumflex +ENCODING -1 +SWIDTH 237 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +30 +78 +FC +DC +ENDCHAR +STARTCHAR Cedilla +ENCODING -1 +SWIDTH 201 0 +DWIDTH 5 0 +BBX 5 7 0 -6 +BITMAP +40 +60 +78 +78 +98 +F8 +F0 +ENDCHAR +STARTCHAR commaaccent.cap +ENCODING -1 +SWIDTH 260 0 +DWIDTH 7 0 +BBX 2 4 2 -5 +BITMAP +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Breve +ENCODING -1 +SWIDTH 241 0 +DWIDTH 6 0 +BBX 6 3 0 19 +BITMAP +CC +FC +FC +ENDCHAR +ENDFONT diff --git a/Elgato_WiFi_Light_Controller/roundedHeavy-46.bdf b/Elgato_WiFi_Light_Controller/roundedHeavy-46.bdf new file mode 100644 index 000000000..72a4c43b7 --- /dev/null +++ b/Elgato_WiFi_Light_Controller/roundedHeavy-46.bdf @@ -0,0 +1,11874 @@ +STARTFONT 2.1 +FONT -FontForge-Ostrich Sans-Heavy-R-Normal-Sans-46-350-96-96--167-- +SIZE 35 96 96 +FONTBOUNDINGBOX 34 50 -5 -10 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +COMMENT "Copyright (c) 2013 by The League of Moveable Type. All rights reserved." +STARTPROPERTIES 39 +FOUNDRY "FontForge" +FAMILY_NAME "Ostrich Sans" +WEIGHT_NAME "Heavy" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "Sans" +PIXEL_SIZE 46 +POINT_SIZE 350 +RESOLUTION_X 96 +RESOLUTION_Y 96 +SPACING "" +AVERAGE_WIDTH 0 +CHARSET_REGISTRY "" +CHARSET_ENCODING "" +FONTNAME_REGISTRY "" +CHARSET_COLLECTIONS "ISO10646-1" +FONT_NAME "OstrichSans-Heavy" +FACE_NAME "Ostrich Sans Heavy" +COPYRIGHT "Copyright (c) 2013 by The League of Moveable Type. All rights reserved." +FONT_VERSION "001.001" +FONT_ASCENT 37 +FONT_DESCENT 9 +UNDERLINE_POSITION -3 +UNDERLINE_THICKNESS 3 +X_HEIGHT 30 +CAP_HEIGHT 30 +RAW_ASCENT 800 +RAW_DESCENT 200 +NORM_SPACE 10 +RELATIVE_WEIGHT 90 +RELATIVE_SETWIDTH 50 +SUPERSCRIPT_X 0 +SUPERSCRIPT_Y 16 +SUPERSCRIPT_SIZE 27 +SUBSCRIPT_X 0 +SUBSCRIPT_Y 3 +SUBSCRIPT_SIZE 27 +AVG_LOWERCASE_WIDTH 179 +AVG_UPPERCASE_WIDTH 179 +ENDPROPERTIES +CHARS 310 +STARTCHAR CR +ENCODING 13 +SWIDTH 210 0 +DWIDTH 10 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 210 0 +DWIDTH 10 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 143 0 +DWIDTH 7 0 +BBX 4 31 0 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +00 +00 +F0 +F0 +F0 +F0 +60 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 212 0 +DWIDTH 10 0 +BBX 7 7 0 24 +BITMAP +FC +FE +FE +FE +FE +FE +FC +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 592 0 +DWIDTH 27 0 +BBX 24 31 -1 0 +BITMAP +001830 +007C78 +007CF8 +007CF8 +007CF8 +0078F0 +00F8F0 +00F9F0 +00F9F0 +00F9F0 +7FFFFF +7FFFFF +7FFFFF +3FFFFF +01F3E0 +01E3E0 +01E3C0 +3FFFF8 +FFFFFE +FFFFFE +FFFFFE +FFFFFE +07CF80 +07CF80 +07CF80 +078F80 +078F00 +0F8F00 +0F9F00 +0F9F00 +0F1F00 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 37 0 -3 +BITMAP +03C0 +07C0 +07C0 +0FE0 +1FF0 +3FF8 +7FFC +7FFE +F83E +F83E +F81E +F81E +F81E +FC1E +7C00 +7E00 +3F80 +1FC0 +0FE0 +07F0 +03F8 +01FC +007C +F03E +F83E +F81E +F81E +F83E +F83E +7FFE +7FFC +3FFC +1FF8 +07E0 +07C0 +07C0 +0380 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 554 0 +DWIDTH 25 0 +BBX 24 31 0 0 +BITMAP +1E00F0 +3F81F0 +7FC1F0 +7FC3E0 +FFC3E0 +FBC3E0 +FBC7C0 +FBC7C0 +FBCF80 +FBCF80 +FFCF80 +7FDF00 +7F9F00 +3F3E00 +043E00 +003E00 +007C00 +007C7C +0078FE +00F9FF +00F9FF +01F3EF +01F3EF +03E3EF +03E3EF +03E3EF +07C3FF +07C1FF +0781FF +0F80FE +07807C +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 479 0 +DWIDTH 22 0 +BBX 19 31 0 0 +BITMAP +07E000 +0FF000 +1FF800 +1FF800 +1FFC00 +3E7C00 +3E7C00 +1E7C00 +1E7C00 +1F7800 +1FF800 +0FF800 +0FF000 +0FF000 +0FE000 +1FE100 +3FF780 +7FF7C0 +7DFFC0 +F8FFC0 +F87F80 +F07F80 +F03F80 +F03F80 +F81F80 +F81F80 +FFFF80 +7FFFC0 +3FFFC0 +1FFBE0 +07E3C0 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 131 0 +DWIDTH 6 0 +BBX 4 7 0 24 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 216 0 +DWIDTH 10 0 +BBX 8 31 0 0 +BITMAP +0C +1E +3F +3E +7E +7C +7C +F8 +F8 +F8 +F8 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F8 +F8 +F8 +F8 +F8 +7C +7C +7E +3E +3F +1E +0C +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 208 0 +DWIDTH 10 0 +BBX 8 31 0 0 +BITMAP +70 +F8 +F8 +FC +7C +3E +3E +3E +1E +1F +1F +1F +1F +1F +1F +1F +1F +1F +1F +1F +1F +1E +1E +3E +3E +7C +7C +FC +F8 +70 +60 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 345 0 +DWIDTH 16 0 +BBX 13 13 0 18 +BITMAP +0780 +0F80 +0F80 +7FF8 +FFF8 +FFF8 +FFF8 +3FF0 +3FE0 +7FF0 +7FF0 +7CF0 +3860 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 434 0 +DWIDTH 20 0 +BBX 17 17 0 7 +BITMAP +008000 +03E000 +03E000 +03E000 +03E000 +03E000 +3FFE00 +FFFF80 +FFFF80 +FFFF80 +7FFF00 +03E000 +03E000 +03E000 +03E000 +03E000 +01C000 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 135 0 +DWIDTH 6 0 +BBX 4 7 0 -2 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +60 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 349 0 +DWIDTH 16 0 +BBX 13 5 0 13 +BITMAP +3FF0 +FFF8 +FFF8 +FFF8 +7FF8 +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 131 0 +DWIDTH 6 0 +BBX 4 5 0 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 434 0 +DWIDTH 20 0 +BBX 15 31 1 0 +BITMAP +001E +001E +003E +003E +007C +007C +007C +00F8 +00F8 +01F0 +01F0 +01F0 +03E0 +03E0 +07C0 +07C0 +07C0 +0F80 +0F80 +1F00 +1F00 +1F00 +3E00 +3E00 +7C00 +7C00 +7C00 +F800 +F800 +F000 +F000 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 370 0 +DWIDTH 17 0 +BBX 14 31 0 0 +BITMAP +0F80 +3FE0 +3FF0 +7FF0 +7FF8 +F8F8 +F878 +F878 +F87C +F87C +F87C +F87C +F87C +F87C +F87C +F87C +F87C +F87C +F87C +F87C +F87C +F87C +F878 +F878 +F878 +F8F8 +7FF8 +7FF0 +3FF0 +3FE0 +0F80 +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 244 0 +DWIDTH 11 0 +BBX 9 31 0 0 +BITMAP +0700 +0F80 +1F80 +3F80 +7F80 +7F80 +FF80 +FF80 +7F80 +2F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F80 +0F00 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 370 0 +DWIDTH 17 0 +BBX 14 31 0 0 +BITMAP +0F80 +3FE0 +3FF0 +7FF8 +7FF8 +F8F8 +F87C +F87C +F87C +F07C +0078 +00F8 +00F8 +01F8 +01F0 +03F0 +07E0 +0FC0 +1F80 +3F00 +3E00 +7C00 +7C00 +7800 +F800 +F800 +FFF0 +FFFC +FFFC +FFFC +7FF8 +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 14 31 0 0 +BITMAP +0F80 +3FE0 +3FF0 +7FF0 +7FF8 +F8F8 +F878 +F87C +F87C +F87C +7078 +00F8 +01F8 +07F0 +0FF0 +1FE0 +1FF0 +0FF0 +01F8 +00F8 +7078 +F87C +F87C +F878 +F878 +F8F8 +7FF8 +7FF0 +3FF0 +3FE0 +0F80 +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 374 0 +DWIDTH 17 0 +BBX 14 31 0 0 +BITMAP +003C +003C +007C +007C +00FC +01FC +01FC +03FC +03FC +07FC +07FC +0FBC +0FBC +1F3C +1E3C +3E3C +3C3C +7C3C +FFFC +FFFC +FFFC +FFFC +3FFC +003C +003C +003C +003C +003C +003C +003C +003C +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 360 0 +DWIDTH 17 0 +BBX 14 31 0 0 +BITMAP +7FF8 +FFF8 +FFFC +FFF8 +FFF8 +F800 +F800 +F800 +F800 +F800 +F800 +FFC0 +FFF0 +FFF0 +FFF8 +FCF8 +F8F8 +F878 +F07C +007C +007C +607C +F07C +F878 +F878 +F8F8 +FDF8 +7FF0 +7FF0 +3FE0 +1FC0 +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 362 0 +DWIDTH 17 0 +BBX 14 31 0 0 +BITMAP +0F80 +1FE0 +3FF0 +7FF8 +7FF8 +78F8 +F878 +F87C +F878 +F838 +F800 +FFE0 +FFF0 +FFF0 +FFF8 +FCF8 +F878 +F878 +F87C +F87C +F87C +F87C +F878 +F878 +F878 +F8F8 +FFF8 +7FF0 +7FF0 +3FE0 +0F80 +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 426 0 +DWIDTH 20 0 +BBX 17 31 0 0 +BITMAP +FFFF00 +FFFF80 +FFFF80 +FFFF80 +7FFF00 +001F00 +001F00 +003E00 +003E00 +007C00 +007C00 +00F800 +00F800 +00F800 +01F000 +01F000 +03E000 +03E000 +03E000 +07C000 +07C000 +0F8000 +0F8000 +1F0000 +1F0000 +1F0000 +3E0000 +3E0000 +7C0000 +7C0000 +380000 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 382 0 +DWIDTH 18 0 +BBX 14 31 0 0 +BITMAP +0FC0 +3FF0 +7FF8 +7FF8 +FFFC +F87C +F87C +F83C +F83C +F83C +F83C +F87C +F87C +7FFC +7FF8 +3FF8 +7FF8 +7FFC +F87C +F87C +F83C +F83C +F83C +F83C +F83C +F87C +FFFC +7FF8 +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 358 0 +DWIDTH 16 0 +BBX 14 31 0 0 +BITMAP +0700 +1FE0 +3FF0 +7FF0 +7FF8 +FCF8 +F878 +F878 +F87C +F87C +F87C +F87C +F87C +F87C +F87C +F8FC +7FFC +7FFC +7FFC +3FFC +0F7C +0078 +F078 +F878 +F878 +F8F8 +FDF8 +7FF0 +7FF0 +3FE0 +1FC0 +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 163 0 +DWIDTH 8 0 +BBX 5 18 0 7 +BITMAP +60 +F0 +F8 +F8 +F8 +F0 +60 +00 +00 +00 +00 +00 +F0 +F8 +F8 +F8 +F0 +F0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 147 0 +DWIDTH 7 0 +BBX 5 19 0 5 +BITMAP +F0 +F8 +F8 +F8 +F8 +F0 +00 +00 +00 +00 +00 +F0 +F0 +F8 +F8 +F8 +F8 +F0 +F0 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 292 0 +DWIDTH 13 0 +BBX 12 16 -1 8 +BITMAP +00E0 +03F0 +07E0 +0FC0 +1F80 +3F00 +7E00 +FC00 +7E00 +7F00 +3F80 +1FC0 +0FE0 +07F0 +01F0 +00C0 +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 362 0 +DWIDTH 17 0 +BBX 13 13 0 8 +BITMAP +FFF8 +FFF8 +FFF8 +FFF8 +0000 +0000 +0000 +0000 +7FF0 +FFF8 +FFF8 +FFF8 +7FF8 +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 292 0 +DWIDTH 13 0 +BBX 11 16 0 8 +BITMAP +F000 +F800 +FC00 +7E00 +3F00 +1F80 +0FC0 +07E0 +07E0 +0FC0 +1F80 +3F00 +7E00 +FC00 +F800 +6000 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 14 31 0 0 +BITMAP +0FC0 +3FE0 +3FF0 +7FF8 +7CF8 +F878 +F87C +F87C +F87C +F87C +707C +00F8 +00F8 +01F0 +03F0 +03E0 +07C0 +0FC0 +0F80 +0F80 +0F00 +0F00 +0F00 +0F00 +0000 +0000 +0F00 +0F00 +0F00 +0F00 +0600 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 697 0 +DWIDTH 32 0 +BBX 28 30 0 0 +BITMAP +00018000 +003FF000 +00FFFC00 +03FFFF00 +07FFFF80 +0FF03FC0 +1FC00FC0 +1F8007E0 +3F3FE3E0 +3E7FF3E0 +7CFFF1E0 +7CFFF1F0 +79F9F1F0 +79F1F1F0 +F9F1E1F0 +F9E1E1E0 +F9F3E3E0 +F9FFE7E0 +F9FFEFC0 +F8FFFFC0 +7C7FFF80 +7C01FF00 +3E00FC80 +3F0003C0 +1FC00FE0 +0FFFFFE0 +07FFFFC0 +03FFFF00 +00FFFC00 +001FE000 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 31 0 0 +BITMAP +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 386 0 +DWIDTH 18 0 +BBX 14 31 0 0 +BITMAP +7FC0 +FFF0 +FFF8 +FFF8 +FFFC +F87C +F87C +F83C +F83C +F83C +F83C +F87C +F87C +FFF8 +FFF8 +FFF0 +FFF8 +FFF8 +F87C +F87C +F83C +F83C +F83C +F83C +F87C +F87C +FFFC +FFF8 +FFF8 +FFF0 +7FC0 +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +07C0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F81E +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F81E +F83E +F83E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +7FC0 +FFF0 +FFF8 +FFF8 +FFFC +F87C +F83C +F83C +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83C +F83C +F87C +FFFC +FFF8 +FFF8 +FFF0 +7FC0 +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 31 0 0 +BITMAP +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 358 0 +DWIDTH 16 0 +BBX 13 31 0 0 +BITMAP +FFF8 +FFF8 +FFF8 +FFF8 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +FFE0 +FFE0 +FFE0 +FFE0 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +6000 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 402 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +07E0 +1FF8 +3FF8 +7FFC +7FFE +F83E +F83E +F83E +F81E +F81E +F81E +F800 +F800 +F800 +F800 +F87C +F9FE +F9FE +F9FE +F8FE +F81E +F81E +F81E +F83E +F83E +F83E +7FFE +7FFC +3FF8 +1FF8 +0FE0 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 14 31 0 0 +BITMAP +F03C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +FFFC +FFFC +FFFC +FFFC +FFFC +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F03C +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 164 0 +DWIDTH 8 0 +BBX 4 31 0 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 374 0 +DWIDTH 17 0 +BBX 14 31 0 0 +BITMAP +0038 +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +607C +F07C +F07C +F07C +F07C +F87C +FFF8 +FFF8 +7FF0 +3FF0 +0FC0 +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 388 0 +DWIDTH 18 0 +BBX 16 31 0 0 +BITMAP +F01E +F81F +F83F +F83E +F87C +F8FC +F8F8 +F9F8 +F9F0 +FBE0 +FFE0 +FFC0 +FF80 +FF80 +FF00 +FF00 +FF80 +FF80 +FFC0 +FFE0 +FBE0 +FBF0 +F9F0 +F9F8 +F8F8 +F87C +F87E +F83E +F83F +F81F +F00E +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 335 0 +DWIDTH 15 0 +BBX 13 31 0 0 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +FFF0 +FFF8 +FFF8 +FFF8 +FFF0 +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 443 0 +DWIDTH 20 0 +BBX 16 31 0 0 +BITMAP +F00F +F80F +F80F +F81F +F81F +F81F +FC1F +FC1F +FC3F +FC3F +FC3F +FE3F +FE3F +FE7F +FE7F +FE7F +FF7F +FF7F +FFFF +FFFF +FFFF +FFFF +FFEF +FFEF +FFEF +FFEF +FBEF +FBEF +FBCF +FBCF +F1CF +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 410 0 +DWIDTH 19 0 +BBX 15 31 0 0 +BITMAP +F01E +F01E +F81E +F81E +FC1E +FC1E +FC1E +FE1E +FE1E +FF1E +FF1E +FF9E +FF9E +FF9E +FFDE +FFDE +FBFE +FBFE +FBFE +F9FE +F9FE +F8FE +F8FE +F8FE +F87E +F87E +F83E +F83E +F83E +F81E +F01E +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 31 0 0 +BITMAP +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 390 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +FFE0 +FFF0 +FFF8 +FFFC +FFFC +F87E +F83E +F83E +F83E +F83E +F83E +F83E +F87C +FFFC +FFF8 +FFF8 +FFE0 +FE00 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +7000 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 16 32 0 -1 +BITMAP +0FC0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F8FE +F9FE +F9FE +7FFC +7FFC +3FFE +1FFF +0FDF +001F +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +7FC0 +FFF0 +FFFC +FFFC +FFFE +F83E +F83E +F81E +F81E +F81E +F83E +F83E +F83E +FFFE +FFFC +FFFC +FFF8 +FFFC +F8FC +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F03C +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F81E +F81E +F81E +F81E +7C00 +7E00 +3F80 +1FC0 +0FE0 +07F0 +03F8 +01FC +007C +F07E +F83E +F81E +F81E +F83E +F83E +7FFE +7FFC +3FFC +1FF8 +0FE0 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 401 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +FFFE +FFFE +FFFE +FFFE +7FFC +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +0380 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 31 0 0 +BITMAP +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 435 0 +DWIDTH 20 0 +BBX 17 31 0 0 +BITMAP +700780 +F80780 +F80780 +780F80 +780F80 +7C0F80 +7C0F00 +7C1F00 +3C1F00 +3E1F00 +3E1E00 +3E3E00 +1E3E00 +1F3E00 +1F3C00 +1F3C00 +0F7C00 +0F7C00 +0FFC00 +0FF800 +07F800 +07F800 +07F800 +07F000 +07F000 +03F000 +03F000 +03E000 +03E000 +01E000 +01C000 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 560 0 +DWIDTH 26 0 +BBX 22 31 0 0 +BITMAP +F0783C +F0783C +F8787C +F87C7C +F8FC7C +F8FC7C +78FC7C +78FC78 +7CFC78 +7CFEF8 +7DFEF8 +7DFEF8 +3DFEF8 +3DFEF0 +3DFEF0 +3FFFF0 +3FFFF0 +3FFFF0 +1FCFF0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +0F87E0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +070380 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 18 31 -1 0 +BITMAP +7803C0 +F803C0 +7C07C0 +7C07C0 +3E0F80 +3E0F80 +1F1F00 +1F1F00 +0FBE00 +0FBE00 +07FC00 +07FC00 +07F800 +03F800 +03F000 +01F000 +03F000 +03F800 +07F800 +07FC00 +07FC00 +0FBE00 +0FBE00 +1F1F00 +1F1F00 +3E0F80 +3E0F80 +7C07C0 +7C07C0 +F803C0 +7803C0 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 17 31 -1 0 +BITMAP +700700 +F80F80 +FC0F80 +7C1F00 +7C1F00 +3E3E00 +3E3E00 +1F7E00 +1F7C00 +1FFC00 +0FF800 +0FF800 +07F000 +07F000 +03F000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +01C000 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 411 0 +DWIDTH 19 0 +BBX 15 31 0 0 +BITMAP +FFFE +FFFE +FFFE +FFFE +7FFE +007C +007C +00F8 +00F8 +01F8 +01F0 +01F0 +03E0 +03E0 +07C0 +07C0 +07C0 +0F80 +0F80 +1F00 +1F00 +3F00 +3E00 +3E00 +7C00 +7C00 +FFF8 +FFFE +FFFE +FFFE +FFFE +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 430 0 +DWIDTH 20 0 +BBX 15 31 1 0 +BITMAP +F000 +F000 +F800 +F800 +7C00 +7C00 +7C00 +3E00 +3E00 +1F00 +1F00 +1F00 +0F80 +0F80 +07C0 +07C0 +07C0 +03E0 +03E0 +01F0 +01F0 +01F0 +00F8 +00F8 +007C +007C +007C +003E +003E +001E +001E +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 237 0 +DWIDTH 11 0 +BBX 11 7 0 33 +BITMAP +1E00 +3F00 +3F80 +7FC0 +FFE0 +FBE0 +F1E0 +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 511 0 +DWIDTH 24 0 +BBX 20 5 1 -1 +BITMAP +7FFFC0 +FFFFE0 +FFFFF0 +FFFFF0 +FFFFE0 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 222 0 +DWIDTH 10 0 +BBX 10 7 0 33 +BITMAP +6000 +FC00 +FE00 +7F80 +1FC0 +0FC0 +03C0 +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 31 0 0 +BITMAP +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 386 0 +DWIDTH 18 0 +BBX 14 31 0 0 +BITMAP +7FC0 +FFF0 +FFF8 +FFF8 +FFFC +F87C +F87C +F83C +F83C +F83C +F83C +F87C +F87C +FFF8 +FFF8 +FFF0 +FFF8 +FFF8 +F87C +F87C +F83C +F83C +F83C +F83C +F87C +F87C +FFFC +FFF8 +FFF8 +FFF0 +7FC0 +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +07C0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F81E +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F81E +F83E +F83E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +7FC0 +FFF0 +FFF8 +FFF8 +FFFC +F87C +F83C +F83C +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83C +F83C +F87C +FFFC +FFF8 +FFF8 +FFF0 +7FC0 +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 31 0 0 +BITMAP +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 358 0 +DWIDTH 16 0 +BBX 13 31 0 0 +BITMAP +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +FFC0 +FFE0 +FFE0 +FFE0 +FFE0 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 402 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +07E0 +1FF8 +3FF8 +7FFC +7FFE +F83E +F83E +F83E +F81E +F81E +F81E +F800 +F800 +F800 +F800 +F87C +F9FE +F9FE +F9FE +F8FE +F81E +F81E +F81E +F83E +F83E +F83E +7FFE +7FFC +3FF8 +1FF8 +0FE0 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 14 31 0 0 +BITMAP +F03C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +FFFC +FFFC +FFFC +FFFC +FFFC +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F03C +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 164 0 +DWIDTH 8 0 +BBX 4 31 0 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 374 0 +DWIDTH 17 0 +BBX 14 31 0 0 +BITMAP +0038 +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +007C +607C +F07C +F07C +F07C +F07C +F87C +FFF8 +FFF8 +7FF0 +3FF0 +0FC0 +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 410 0 +DWIDTH 19 0 +BBX 16 31 0 0 +BITMAP +F01E +F81F +F83F +F83E +F87C +F8FC +F8F8 +F9F8 +F9F0 +FBE0 +FFE0 +FFC0 +FF80 +FF80 +FF00 +FF00 +FF80 +FF80 +FFC0 +FFE0 +FBE0 +FBF0 +F9F0 +F9F8 +F8F8 +F87C +F87E +F83E +F83F +F81F +F00E +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 335 0 +DWIDTH 15 0 +BBX 13 31 0 0 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +FFF0 +FFF8 +FFF8 +FFF8 +FFF0 +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 443 0 +DWIDTH 20 0 +BBX 16 31 0 0 +BITMAP +F00F +F80F +F80F +F81F +F81F +F81F +FC1F +FC1F +FC3F +FC3F +FC3F +FE3F +FE3F +FE7F +FE7F +FE7F +FF7F +FF7F +FFFF +FFFF +FFFF +FFFF +FFEF +FFEF +FFEF +FFEF +FBEF +FBEF +FBCF +FBCF +F1CF +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 410 0 +DWIDTH 19 0 +BBX 15 31 0 0 +BITMAP +F01E +F01E +F81E +F81E +FC1E +FC1E +FC1E +FE1E +FE1E +FF1E +FF1E +FF9E +FF9E +FF9E +FFDE +FFDE +FBFE +FBFE +FBFE +F9FE +F9FE +F8FE +F8FE +F8FE +F87E +F87E +F83E +F83E +F83E +F81E +F01E +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 31 0 0 +BITMAP +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 390 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +7FC0 +FFF0 +FFF8 +FFFC +FFFC +F87C +F83E +F83E +F83E +F83E +F83E +F83E +F87C +FFFC +FFFC +FFF8 +FFF0 +FF80 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +7000 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 16 32 0 -1 +BITMAP +0FE0 +3FF0 +7FF8 +7FFC +FEFC +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F8FE +F9FE +F9FC +7FFC +7FFC +3FFE +1FFF +07DF +001F +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +FFF0 +FFF8 +FFFC +FFFC +FFFE +F83E +F83E +F81E +F81E +F81E +F83E +F83E +F87E +FFFC +FFFC +FFF8 +FFFC +FFFC +F87C +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +701C +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +0FE0 +1FF0 +3FF8 +7FFC +7FFE +F83E +F83E +F81E +F81E +F81E +F81E +7C00 +7E00 +3F80 +1FC0 +0FE0 +07F0 +03F8 +01FC +007C +F07E +F83E +F81E +F81E +F83E +F83E +7FFE +7FFC +3FFC +1FF8 +07E0 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 401 0 +DWIDTH 18 0 +BBX 15 31 0 0 +BITMAP +FFFE +FFFE +FFFE +FFFE +7FFC +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +0380 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 31 0 0 +BITMAP +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FE0 +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 435 0 +DWIDTH 20 0 +BBX 17 31 0 0 +BITMAP +700780 +F80780 +F80780 +780F80 +780F80 +7C0F80 +7C0F00 +7C1F00 +3C1F00 +3E1F00 +3E1E00 +3E3E00 +1E3E00 +1F3E00 +1F3C00 +1F3C00 +0F7C00 +0F7C00 +0FFC00 +0FF800 +07F800 +07F800 +07F800 +07F000 +07F000 +03F000 +03F000 +03E000 +03E000 +01E000 +01C000 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 555 0 +DWIDTH 26 0 +BBX 22 31 0 0 +BITMAP +F0783C +F0783C +F8787C +F87C7C +F8FC7C +F8FC7C +78FC7C +78FC78 +7CFC78 +7CFEF8 +7DFEF8 +7DFEF8 +3DFEF8 +3DFEF0 +3DFEF0 +3FFFF0 +3FFFF0 +3FFFF0 +1FCFF0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +0F87E0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +070380 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 18 31 -1 0 +BITMAP +7803C0 +F803C0 +7C07C0 +7C07C0 +3E0F80 +3E0F80 +1F1F00 +1F1F00 +0FBE00 +0FBE00 +07FC00 +07FC00 +07F800 +03F800 +03F000 +01F000 +03F000 +03F800 +07F800 +07FC00 +07FC00 +0FBE00 +0FBE00 +1F1F00 +1F1F00 +3E0F80 +3E0F80 +7C07C0 +7C07C0 +F803C0 +7803C0 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 17 31 -1 0 +BITMAP +700700 +F80F80 +FC0F80 +7C1F00 +7C1F00 +3E3E00 +3E3E00 +1F7E00 +1F7C00 +1FFC00 +0FF800 +0FF800 +07F000 +07F000 +03F000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +01C000 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 411 0 +DWIDTH 19 0 +BBX 15 31 0 0 +BITMAP +FFFE +FFFE +FFFE +FFFE +7FFE +007C +007C +00F8 +00F8 +01F8 +01F0 +01F0 +03E0 +03E0 +07C0 +07C0 +07C0 +0F80 +0F80 +1F00 +1F00 +3F00 +3E00 +3E00 +7C00 +7C00 +FFF8 +FFFE +FFFE +FFFE +FFFE +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 139 0 +DWIDTH 6 0 +BBX 4 31 0 0 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 322 0 +DWIDTH 15 0 +BBX 14 7 0 29 +BITMAP +1C00 +7F18 +FFFC +FFFC +FFFC +F3F8 +01E0 +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 143 0 +DWIDTH 7 0 +BBX 4 31 0 0 +BITMAP +F0 +F0 +F0 +F0 +60 +00 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +60 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 373 0 +DWIDTH 17 0 +BBX 15 31 0 0 +BITMAP +01E0 +07F8 +0FFC +1FFC +1FFE +1E3E +3E1C +3E00 +3E00 +3E00 +3E00 +3E00 +3E00 +7FF0 +FFF8 +FFF8 +FFF8 +FFF8 +3E00 +3E00 +3E00 +3E00 +3E00 +3C00 +7C00 +7C00 +FC00 +FFFE +FFFE +FFFE +FFFE +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 229 0 +DWIDTH 11 0 +BBX 10 5 0 33 +BITMAP +F3C0 +F3C0 +F3C0 +F3C0 +F3C0 +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 709 0 +DWIDTH 33 0 +BBX 28 32 1 0 +BITMAP +00040000 +00FFE000 +01FFF800 +07FFFC00 +0FFFFE00 +1FE07F00 +1F801F80 +3F1F0FC0 +7E7FC7C0 +7C7FE3E0 +78FFE3E0 +F8FBE1E0 +F8F1E1F0 +F0F1F1F0 +F0F1E1F0 +F0F0C0F0 +F0F000F0 +F0F000F0 +F0F1E1F0 +F0F1F1F0 +F8F1E1F0 +F8FBE1E0 +F8FFE3E0 +7C7FE3E0 +7E7FC7C0 +3F3F8FC0 +1F803F80 +1FF9FF00 +0FFFFE00 +03FFFC00 +01FFF000 +003FC000 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 723 0 +DWIDTH 33 0 +BBX 28 32 1 0 +BITMAP +00040000 +00FFE000 +03FFF800 +07FFFC00 +0FFFFF00 +1FE07F00 +3F801F80 +3F7F8FC0 +7E7FC7C0 +7C7FE3E0 +F87FE3E0 +F87FE1E0 +F87DE1F0 +F07DE1F0 +F07FE1F0 +F07FE0F0 +F07FC0F0 +F07FE0F0 +F07FE1F0 +F07FE1F0 +F87DE1F0 +F87DE1E0 +787DE3E0 +7C7DE3E0 +7E79E7C0 +3F39CFC0 +1F803F80 +1FF9FF00 +0FFFFE00 +03FFFC00 +01FFF000 +003FC000 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 231 0 +DWIDTH 11 0 +BBX 10 5 0 33 +BITMAP +7F80 +FFC0 +FFC0 +FFC0 +FFC0 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 142 0 +DWIDTH 7 0 +BBX 7 6 -1 30 +BITMAP +7C +7E +E6 +E6 +7E +3C +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 247 0 +DWIDTH 11 0 +BBX 10 7 0 33 +BITMAP +03C0 +0FC0 +3FC0 +7F80 +FE00 +FC00 +6000 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 83 0 +DWIDTH 4 0 +BBX 5 5 -1 15 +BITMAP +78 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 201 0 +DWIDTH 9 0 +BBX 9 11 0 -10 +BITMAP +3800 +3800 +3C00 +3F00 +3F80 +3F80 +8780 +FF80 +FF80 +FF00 +1800 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 140 0 +DWIDTH 6 0 +BBX 7 6 -1 30 +BITMAP +7C +7E +E6 +E6 +7E +3C +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 14 31 -1 0 +BITMAP +0180 +03C0 +03C0 +03C0 +03C0 +0000 +0000 +03C0 +03C0 +03C0 +07C0 +07C0 +07C0 +0F80 +1F80 +1F00 +3F00 +7E00 +7C00 +7C00 +F838 +F87C +F87C +F87C +F878 +F8F8 +7CF8 +7FF8 +3FF0 +3FE0 +0FC0 +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 40 0 0 +BITMAP +060000 +0FC000 +0FE000 +07F800 +01FC00 +00FC00 +003C00 +000000 +000000 +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 40 0 0 +BITMAP +001800 +00FC00 +01FC00 +07F800 +0FF000 +0FC000 +0F0000 +000000 +000000 +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 40 0 0 +BITMAP +01C000 +03E000 +03F000 +07F800 +0FFC00 +0FFC00 +0F3C00 +000000 +000000 +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 39 0 0 +BITMAP +070000 +1FCE00 +1FFF00 +3FFF00 +3FFE00 +3CFC00 +007800 +000000 +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 38 0 0 +BITMAP +0F3C00 +0F3C00 +0F3C00 +0F3C00 +0F3C00 +000000 +000000 +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 40 0 0 +BITMAP +00C000 +03F000 +03F000 +033000 +037000 +03F000 +01E000 +000000 +000000 +01C000 +03E000 +03E000 +03E000 +03E000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 665 0 +DWIDTH 31 0 +BBX 26 31 0 0 +BITMAP +0007FFC0 +0007FFC0 +000FFFC0 +000FFFC0 +001FFF80 +001F8000 +003F8000 +003F8000 +007F8000 +007F8000 +007F8000 +00FF8000 +00FF8000 +01F7FF80 +01F7FFC0 +03E7FFC0 +03E7FFC0 +07C7FF80 +07FF8000 +0FFF8000 +0FFF8000 +0FFF8000 +1FFF8000 +1F078000 +3E078000 +3E078000 +7C07FF80 +7C07FFC0 +F807FFC0 +F807FFC0 +7007FFC0 +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 15 41 0 -10 +BITMAP +07C0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F81E +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F81E +F83E +F83E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +0380 +0380 +03F0 +03F8 +03F8 +007C +0FFC +0FF8 +07F0 +01C0 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 40 0 0 +BITMAP +1800 +3F00 +3F80 +1FE0 +07F0 +03F0 +0070 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 40 0 0 +BITMAP +0060 +03F0 +07F0 +1FE0 +3F80 +3F00 +3C00 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 40 0 0 +BITMAP +0700 +0F80 +1FC0 +3FE0 +3FF0 +7DF0 +3DE0 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 38 0 0 +BITMAP +3CF0 +3CF0 +3CF0 +3CF0 +3CF0 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 10 40 -2 0 +BITMAP +6000 +F800 +FE00 +7F80 +3FC0 +0FC0 +03C0 +0000 +0000 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 11 40 -3 0 +BITMAP +00C0 +07E0 +1FE0 +3FC0 +7F00 +FC00 +7000 +0000 +0000 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 11 40 -3 0 +BITMAP +0E00 +1F00 +3F80 +7FC0 +FFC0 +FBE0 +F3C0 +0000 +0000 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 11 38 -3 0 +BITMAP +71E0 +FBE0 +FBE0 +FBE0 +71E0 +0000 +0000 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 18 31 -4 0 +BITMAP +0FFC00 +0FFF00 +0FFF80 +0FFF80 +0FFFC0 +0F87C0 +0F87C0 +0F83C0 +0F83C0 +0F83C0 +0F83C0 +0F83C0 +0F83C0 +7FF3C0 +FFFBC0 +FFFBC0 +FFFBC0 +7FFBC0 +0F83C0 +0F83C0 +0F83C0 +0F83C0 +0F83C0 +0F83C0 +0F87C0 +0F87C0 +0FFFC0 +0FFF80 +0FFF80 +0FFF00 +0FFC00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 410 0 +DWIDTH 19 0 +BBX 15 39 0 0 +BITMAP +0E00 +3F9C +3FFE +7FFE +7FFC +79F8 +00F0 +0000 +F01E +F01E +F81E +F81E +FC1E +FC1E +FC1E +FE1E +FE1E +FF1E +FF1E +FF9E +FF9E +FF9E +FFDE +FFDE +FBFE +FBFE +FBFE +F9FE +F9FE +F8FE +F8FE +F8FE +F87E +F87E +F83E +F83E +F83E +F81E +F01E +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0C00 +1F80 +1FC0 +0FF0 +03F8 +01F8 +0078 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0060 +01F0 +07F0 +0FF0 +1FC0 +3F00 +1C00 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0380 +07C0 +0FE0 +1FF0 +1FF8 +3EF8 +1E78 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 39 0 0 +BITMAP +0E00 +3F9C +7FFE +7FFE +FFFC +7BF8 +0060 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 38 0 0 +BITMAP +1E78 +3E78 +3EF8 +3EF8 +1E78 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 294 0 +DWIDTH 14 0 +BBX 11 11 0 10 +BITMAP +71C0 +FBE0 +FFE0 +FFE0 +7FC0 +3F80 +7FC0 +FFE0 +FFE0 +FBE0 +71C0 +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 16 31 0 0 +BITMAP +07EE +1FFF +3FFF +7FFE +7FFE +F87E +F87E +F87E +F8FE +F8FE +F8FE +F9FE +F9FE +FBFE +FBFE +FBDE +FFDE +FFDE +FF9E +FF9E +FF1E +FF1E +FF1E +FE3E +FE3E +FC3E +7FFC +7FFC +FFF8 +FFF0 +F7E0 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0C00 +1F00 +1FC0 +0FF0 +07F8 +01F8 +0078 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0030 +01F8 +03F8 +0FF0 +1FE0 +1F80 +1E00 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0300 +07C0 +0FC0 +1FE0 +3FF0 +3FF0 +3CF0 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 38 0 0 +BITMAP +1C70 +3EF8 +3EF8 +3EF8 +1C70 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 17 40 -1 0 +BITMAP +001800 +00FC00 +01FC00 +07F800 +0FF000 +0FC000 +0F0000 +000000 +000000 +700700 +F80F80 +FC0F80 +7C1F00 +7C1F00 +3E3E00 +3E3E00 +1F7E00 +1F7C00 +1FFC00 +0FF800 +0FF800 +07F000 +07F000 +03F000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +01C000 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 386 0 +DWIDTH 18 0 +BBX 17 31 0 0 +BITMAP +F00000 +F00000 +F00000 +F00000 +F00000 +F00000 +F00000 +F00000 +FFF000 +FFFC00 +FFFE00 +FFFF00 +FFFF00 +F01F80 +F00F80 +F00F80 +F00F80 +F01F80 +FFFF00 +FFFF00 +FFFE00 +FFFC00 +FFF000 +F00000 +F00000 +F00000 +F00000 +F00000 +F00000 +F00000 +F00000 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 376 0 +DWIDTH 17 0 +BBX 15 30 0 0 +BITMAP +0F80 +3FE0 +7FF0 +7FF8 +FDF8 +F8F8 +F878 +F078 +F078 +F078 +F078 +F0F8 +F0F8 +F7F0 +F7F0 +F7F0 +F7F8 +F1FC +F07C +F03C +F03E +F03E +F03E +F03E +F03C +F0FC +F7FC +F7F8 +F7F0 +F7E0 +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 40 0 0 +BITMAP +060000 +0FC000 +0FE000 +07F800 +01FC00 +00FC00 +003C00 +000000 +000000 +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 40 0 0 +BITMAP +001800 +00FC00 +01FC00 +07F800 +0FF000 +0FC000 +0F0000 +000000 +000000 +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 40 0 0 +BITMAP +01C000 +03E000 +03F000 +07F800 +0FFC00 +0FFC00 +0F3C00 +000000 +000000 +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 39 0 0 +BITMAP +070000 +1FCE00 +1FFF00 +3FFF00 +3FFE00 +3CFC00 +007800 +000000 +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 38 0 0 +BITMAP +0F3C00 +0F3C00 +0F3C00 +0F3C00 +0F3C00 +000000 +000000 +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 40 0 0 +BITMAP +00C000 +03F000 +03F000 +033000 +037000 +03F000 +01E000 +000000 +000000 +01C000 +03E000 +03E000 +03E000 +03E000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 665 0 +DWIDTH 31 0 +BBX 25 30 0 0 +BITMAP +0007FF80 +000FFF80 +000FFF80 +000FFF80 +001FFF00 +001F8000 +003F8000 +003F8000 +007F8000 +007F8000 +00FF8000 +00FF8000 +01F78000 +01F7FF80 +01E7FF80 +03E7FF80 +03E7FF80 +07FF8000 +07FF8000 +0FFF8000 +0FFF8000 +1FFF8000 +1F078000 +1E078000 +3E078000 +3C078000 +7C07FF80 +7807FF80 +F807FF80 +7007FF80 +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 15 41 0 -10 +BITMAP +07C0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F81E +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F81E +F83E +F83E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +0380 +0380 +03F0 +03F8 +03F8 +007C +0FFC +0FF8 +07F0 +01C0 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 40 0 0 +BITMAP +1800 +3F00 +3F80 +1FE0 +07F0 +03F0 +0070 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 40 0 0 +BITMAP +0060 +03F0 +07F0 +1FE0 +3F80 +3F00 +3C00 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 40 0 0 +BITMAP +0700 +0F80 +1FC0 +3FE0 +3FF0 +7DF0 +3DE0 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 38 0 0 +BITMAP +3CF0 +3CF0 +3CF0 +3CF0 +3CF0 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 10 40 -2 0 +BITMAP +6000 +F800 +FE00 +7F80 +3FC0 +0FC0 +03C0 +0000 +0000 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +3C00 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 11 40 -3 0 +BITMAP +00C0 +07E0 +1FE0 +3FC0 +7F00 +FC00 +7000 +0000 +0000 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 11 40 -3 0 +BITMAP +0E00 +1F00 +3F80 +7FC0 +FFC0 +FBE0 +F3C0 +0000 +0000 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 11 38 -3 0 +BITMAP +71E0 +FBE0 +FBE0 +FBE0 +71E0 +0000 +0000 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 18 30 -4 0 +BITMAP +07F800 +0FFE00 +0FFF00 +0FFF80 +0FFF80 +0F87C0 +0F87C0 +0F87C0 +0F83C0 +0F83C0 +0F83C0 +0F83C0 +0F83C0 +7FFBC0 +FFFBC0 +FFFBC0 +FFFBC0 +0F83C0 +0F83C0 +0F83C0 +0F83C0 +0F83C0 +0F83C0 +0F87C0 +0F87C0 +0F9F80 +0FFF80 +0FFF00 +0FFE00 +07FC00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 410 0 +DWIDTH 19 0 +BBX 15 39 0 0 +BITMAP +0E00 +3F9C +3FFE +7FFE +7FFC +79F8 +00F0 +0000 +F01E +F01E +F81E +F81E +FC1E +FC1E +FC1E +FE1E +FE1E +FF1E +FF1E +FF9E +FF9E +FF9E +FFDE +FFDE +FBFE +FBFE +FBFE +F9FE +F9FE +F8FE +F8FE +F8FE +F87E +F87E +F83E +F83E +F83E +F81E +F01E +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0C00 +1F80 +1FC0 +0FF0 +03F8 +01F8 +0078 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0030 +01F8 +03F8 +0FF0 +1FE0 +1F80 +1E00 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0380 +07C0 +0FE0 +1FF0 +1FF8 +3EF8 +1E78 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 39 0 0 +BITMAP +0E00 +3F9C +7FFE +7FFE +FFFC +7BF8 +0060 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 38 0 0 +BITMAP +1E78 +3E78 +3EF8 +3EF8 +1E78 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 163 0 +DWIDTH 8 0 +BBX 5 18 0 7 +BITMAP +60 +F0 +F8 +F8 +F8 +F0 +60 +00 +00 +00 +00 +00 +F0 +F8 +F8 +F8 +F0 +F0 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 16 31 0 0 +BITMAP +07EE +1FFF +3FFF +7FFE +7FFE +F87E +F87E +F87E +F8FE +F8FE +F8FE +F9FE +F9FE +FBFE +FBFE +FBDE +FFDE +FFDE +FF9E +FF9E +FF1E +FF1E +FF1E +FE3E +FE3E +FC3E +7FFC +7FFC +FFF8 +FFF0 +F7E0 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0C00 +1F00 +1FC0 +0FF0 +07F8 +01F8 +0078 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0030 +01F8 +03F8 +0FF0 +1FE0 +1F80 +1E00 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0300 +07C0 +0FC0 +1FE0 +3FF0 +3FF0 +3CF0 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 38 0 0 +BITMAP +1C70 +3EF8 +3EF8 +3EF8 +1C70 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 17 40 -1 0 +BITMAP +001800 +00FC00 +01FC00 +07F800 +0FF000 +0FC000 +0F0000 +000000 +000000 +700700 +F80F80 +FC0F80 +7C1F00 +7C1F00 +3E3E00 +3E3E00 +1F7E00 +1F7C00 +1FFC00 +0FF800 +0FF800 +07F000 +07F000 +03F000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +01C000 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 386 0 +DWIDTH 18 0 +BBX 16 30 0 0 +BITMAP +7000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +FFF8 +FFFC +FFFE +FFFF +F03F +F00F +F00F +F00F +F00F +F03F +FFFF +FFFE +FFFC +FFF8 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 17 38 -1 0 +BITMAP +0F3C00 +1F3C00 +1F7C00 +1F7C00 +0F3C00 +000000 +000000 +700700 +F80F80 +FC0F80 +7C1F00 +7C1F00 +3E3E00 +3E3E00 +1F7E00 +1F7C00 +1FFC00 +0FF800 +0FF800 +07F000 +07F000 +03F000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +01C000 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 38 0 0 +BITMAP +07F000 +0FFC00 +0FFC00 +0FFC00 +0FFC00 +000000 +000000 +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 442 0 +DWIDTH 20 0 +BBX 17 38 0 0 +BITMAP +07F000 +0FFC00 +0FFC00 +0FFC00 +0FFC00 +000000 +000000 +01C000 +03E000 +03E000 +03E000 +03F000 +03F000 +07F000 +07F000 +07F000 +07F800 +0FF800 +0F7800 +0F7800 +0F7C00 +1F7C00 +1F7C00 +1F3C00 +1E3C00 +1FFE00 +3FFE00 +3FFE00 +3FFE00 +3FFF00 +7C1F00 +7C1F00 +7C0F00 +780F80 +F80F80 +F80F80 +F80F80 +700780 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0030 +00F8 +03F8 +0FF0 +1FE0 +1F80 +1E00 +0000 +0000 +07C0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F81E +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F81E +F83E +F83E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0030 +00F8 +03F8 +0FF0 +1FE0 +1F80 +1E00 +0000 +0000 +07C0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F81E +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F81E +F83E +F83E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0380 +07C0 +0FE0 +1FF0 +1FF0 +3EF8 +1EF0 +0000 +0000 +07C0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F81E +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F81E +F83E +F83E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0380 +07C0 +0FE0 +1FF0 +1FF0 +3EF8 +1EF0 +0000 +0000 +07C0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F81E +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F81E +F83E +F83E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 15 38 0 0 +BITMAP +0380 +07C0 +07C0 +07C0 +07C0 +0000 +0000 +07C0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F81E +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F81E +F83E +F83E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 15 38 0 0 +BITMAP +0380 +07C0 +07C0 +07C0 +07C0 +0000 +0000 +07C0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F81E +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F81E +F83E +F83E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +1C70 +3EF8 +3FF8 +1FF0 +0FE0 +07C0 +03C0 +0000 +0000 +07C0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F81E +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F81E +F83E +F83E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +1C70 +3EF8 +3FF8 +1FF0 +0FE0 +07C0 +03C0 +0000 +0000 +07C0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F83E +F83E +F81E +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F81E +F83E +F83E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +38E0 +7DF0 +7FF0 +3FE0 +1FC0 +0FC0 +0780 +0000 +0000 +7FC0 +FFF0 +FFF8 +FFF8 +FFFC +F87C +F83C +F83C +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83C +F83C +F87C +FFFC +FFF8 +FFF8 +FFF0 +7FC0 +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +38E0 +7DF0 +7FF0 +3FE0 +1FC0 +0FC0 +0780 +0000 +0000 +7FC0 +FFF0 +FFF8 +FFF8 +FFFC +F87C +F83C +F83C +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83C +F83C +F87C +FFFC +FFF8 +FFF8 +FFF0 +7FC0 +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 418 0 +DWIDTH 19 0 +BBX 18 31 -1 0 +BITMAP +0FF800 +0FFE00 +0FFF00 +0FFF80 +0FFF80 +0F0FC0 +0F07C0 +0F07C0 +0F07C0 +0F07C0 +0F07C0 +0F07C0 +0F07C0 +7FE7C0 +FFF7C0 +FFF7C0 +FFF7C0 +7FE7C0 +0F07C0 +0F07C0 +0F07C0 +0F07C0 +0F07C0 +0F07C0 +0F07C0 +0F0FC0 +0FFF80 +0FFF80 +0FFF00 +0FFE00 +0FF800 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 418 0 +DWIDTH 19 0 +BBX 17 30 0 0 +BITMAP +1FF000 +1FFC00 +1FFE00 +1FFF00 +1FFF00 +1E1F00 +1E0F00 +1E0F80 +1E0F80 +1E0F80 +1E0F80 +1E0F80 +1E0F80 +FFCF80 +FFEF80 +FFEF80 +FFEF80 +1E0F80 +1E0F80 +1E0F80 +1E0F80 +1E0F80 +1E0F80 +1E0F00 +1E1F00 +1E7F00 +1FFF00 +1FFE00 +1FFC00 +1FF000 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 38 0 0 +BITMAP +1FE0 +3FF0 +7FF0 +7FF0 +3FE0 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 38 0 0 +BITMAP +1FE0 +3FF0 +7FF0 +7FF0 +3FE0 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 39 0 0 +BITMAP +78E0 +7FF0 +7FF0 +7FE0 +3FE0 +0F80 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 39 0 0 +BITMAP +78E0 +7FF0 +7FF0 +7FE0 +3FE0 +0F80 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 38 0 0 +BITMAP +0300 +0780 +0780 +0780 +0780 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 38 0 0 +BITMAP +0300 +0780 +0780 +0780 +0780 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 40 0 0 +BITMAP +18E0 +3DF0 +3FF0 +3FE0 +1FE0 +0FC0 +0780 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 353 0 +DWIDTH 16 0 +BBX 13 40 0 0 +BITMAP +18E0 +3DF0 +3FF0 +3FE0 +1FE0 +0FC0 +0780 +0000 +0000 +FFF8 +FFF8 +FFF8 +FFF8 +FFF0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFE0 +FFF0 +FFF0 +FFF0 +FFE0 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +F800 +FFF0 +FFF8 +FFF8 +FFF8 +FFF8 +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 402 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0380 +07C0 +0FE0 +1FF0 +1FF0 +3EF8 +1EF0 +0000 +0000 +07E0 +1FF8 +3FF8 +7FFC +7FFE +F83E +F83E +F83E +F81E +F81E +F81E +F800 +F800 +F800 +F800 +F87C +F9FE +F9FE +F9FE +F8FE +F81E +F81E +F81E +F83E +F83E +F83E +7FFE +7FFC +3FF8 +1FF8 +0FE0 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 402 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0380 +07C0 +0FE0 +1FF0 +3FF0 +3EF8 +3EF0 +0000 +0000 +07E0 +1FF8 +3FF8 +7FFC +7FFE +F83E +F83E +F83E +F81E +F81E +F81E +F800 +F800 +F800 +F800 +F87C +F9FE +F9FE +F9FE +F8FE +F81E +F81E +F81E +F83E +F83E +F83E +7FFE +7FFC +3FF8 +1FF8 +0FE0 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 402 0 +DWIDTH 18 0 +BBX 15 39 0 0 +BITMAP +3C70 +3FF8 +3FF8 +3FF0 +1FF0 +07C0 +0000 +0000 +07E0 +1FF8 +3FF8 +7FFC +7FFE +F83E +F83E +F83E +F81E +F81E +F81E +F800 +F800 +F800 +F800 +F87C +F9FE +F9FE +F9FE +F8FE +F81E +F81E +F81E +F83E +F83E +F83E +7FFE +7FFC +3FF8 +1FF8 +0FE0 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 402 0 +DWIDTH 18 0 +BBX 15 39 0 0 +BITMAP +1C78 +3FF8 +3FF8 +1FF8 +1FF0 +07C0 +0000 +0000 +07E0 +1FF8 +3FF8 +7FFC +7FFE +F83E +F83E +F83E +F81E +F81E +F81E +F800 +F800 +F800 +F800 +F87C +F9FE +F9FE +F9FE +F8FE +F81E +F81E +F81E +F83E +F83E +F83E +7FFE +7FFC +3FF8 +1FF8 +0FE0 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 402 0 +DWIDTH 18 0 +BBX 15 38 0 0 +BITMAP +0180 +03C0 +07C0 +07C0 +03C0 +0000 +0000 +07E0 +1FF8 +3FF8 +7FFC +7FFE +F83E +F83E +F83E +F81E +F81E +F81E +F800 +F800 +F800 +F800 +F87C +F9FE +F9FE +F9FE +F8FE +F81E +F81E +F81E +F83E +F83E +F83E +7FFE +7FFC +3FF8 +1FF8 +0FE0 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 402 0 +DWIDTH 18 0 +BBX 15 38 0 0 +BITMAP +0180 +03C0 +07C0 +07C0 +03C0 +0000 +0000 +07E0 +1FF8 +3FF8 +7FFC +7FFE +F83E +F83E +F83E +F81E +F81E +F81E +F800 +F800 +F800 +F800 +F87C +F9FE +F9FE +F9FE +F8FE +F81E +F81E +F81E +F83E +F83E +F83E +7FFE +7FFC +3FF8 +1FF8 +0FE0 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 402 0 +DWIDTH 18 0 +BBX 15 40 0 -9 +BITMAP +07C0 +1FF0 +3FF8 +7FFC +7FFC +FC3E +F83E +F83E +F81E +F81E +F81E +F800 +F800 +F800 +F800 +F800 +F9FE +F9FE +F9FE +F9FE +F81E +F81E +F81E +F81E +F83E +F83E +7EFE +7FFC +3FFC +3FF8 +0FE0 +0000 +0000 +01C0 +03C0 +03C0 +03C0 +03C0 +03C0 +0180 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 402 0 +DWIDTH 18 0 +BBX 15 40 0 -9 +BITMAP +07C0 +1FF0 +3FF8 +7FFC +7FFC +FC3E +F83E +F83E +F81E +F81E +F81E +F800 +F800 +F800 +F800 +F800 +F9FE +F9FE +F9FE +F9FE +F81E +F81E +F81E +F81E +F83E +F83E +7EFE +7FFC +3FFC +3FF8 +0FE0 +0000 +0000 +01C0 +03C0 +03C0 +03C0 +03C0 +03C0 +0180 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 14 40 0 0 +BITMAP +0380 +07C0 +0FE0 +1FE0 +3FF0 +3FF0 +3CF0 +0000 +0000 +F03C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +FFFC +FFFC +FFFC +FFFC +FFFC +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F03C +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 394 0 +DWIDTH 18 0 +BBX 14 40 0 0 +BITMAP +0380 +07C0 +0FE0 +1FE0 +3FF0 +3FF0 +3CF0 +0000 +0000 +F03C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +FFFC +FFFC +FFFC +FFFC +FFFC +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F83C +F03C +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 14 39 -5 0 +BITMAP +1C00 +3F3C +7FFC +FFFC +FFF8 +F3F8 +00E0 +0000 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 14 39 -5 0 +BITMAP +1C00 +3F3C +7FFC +FFFC +FFF8 +F3F8 +00E0 +0000 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +0780 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 10 38 -3 0 +BITMAP +7F80 +FFC0 +FFC0 +FFC0 +FFC0 +0000 +0000 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 10 38 -3 0 +BITMAP +7F80 +FFC0 +FFC0 +FFC0 +FFC0 +0000 +0000 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 10 39 -3 0 +BITMAP +F3C0 +FFC0 +FFC0 +FFC0 +7F80 +3F00 +0000 +0000 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 10 39 -3 0 +BITMAP +F3C0 +FFC0 +FFC0 +FFC0 +7F80 +3F00 +0000 +0000 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 5 38 0 0 +BITMAP +60 +F0 +F8 +F8 +F0 +00 +00 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 159 0 +DWIDTH 7 0 +BBX 5 30 0 0 +BITMAP +70 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 374 0 +DWIDTH 17 0 +BBX 18 40 0 0 +BITMAP +001C00 +003E00 +007F00 +00FF00 +01FF80 +01FFC0 +01E780 +000000 +000000 +003800 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +607C00 +F07C00 +F07C00 +F07C00 +F07C00 +F87C00 +FFF800 +FFF800 +7FF000 +3FF000 +0FC000 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 374 0 +DWIDTH 17 0 +BBX 18 40 0 0 +BITMAP +001C00 +003E00 +007F00 +00FF00 +01FF80 +01FFC0 +01E780 +000000 +000000 +003800 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +007C00 +607C00 +F07C00 +F07C00 +F07C00 +F07C00 +F87C00 +FFF800 +FFF800 +7FF000 +3FF000 +0FC000 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 388 0 +DWIDTH 18 0 +BBX 16 40 0 -9 +BITMAP +F01E +F81F +F83F +F83E +F87C +F8FC +F8F8 +F9F8 +F9F0 +FBE0 +FFE0 +FFC0 +FF80 +FF80 +FF00 +FF00 +FF80 +FF80 +FFC0 +FFE0 +FBE0 +FBF0 +F9F0 +F9F8 +F8F8 +F87C +F87E +F83E +F83F +F81F +F00E +0000 +0000 +03C0 +07C0 +07C0 +07C0 +07C0 +07C0 +0380 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 388 0 +DWIDTH 18 0 +BBX 16 40 0 -9 +BITMAP +F01E +F81F +F83F +F83E +F87C +F8FC +F8F8 +F9F8 +F9F0 +FBE0 +FFE0 +FFC0 +FF80 +FF80 +FF00 +FF00 +FF80 +FF80 +FFC0 +FFE0 +FBE0 +FBF0 +F9F0 +F9F8 +F8F8 +F87C +F87E +F83E +F83F +F81F +F00E +0000 +0000 +03C0 +07C0 +07C0 +07C0 +07C0 +07C0 +0380 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 335 0 +DWIDTH 15 0 +BBX 16 40 -3 0 +BITMAP +0180 +0FC0 +1FC0 +7F80 +FE00 +FC00 +F000 +0000 +0000 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1FFE +1FFF +1FFF +1FFF +1FFE +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 335 0 +DWIDTH 15 0 +BBX 16 40 -3 0 +BITMAP +0180 +0FC0 +1FC0 +7F80 +FE00 +FC00 +F000 +0000 +0000 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1E00 +1FFE +1FFF +1FFF +1FFF +1FFE +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 335 0 +DWIDTH 15 0 +BBX 13 40 0 -9 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +FFF0 +FFF8 +FFF8 +FFF8 +FFF0 +0000 +0000 +0F00 +0F80 +0F80 +0F80 +0F80 +0F00 +0600 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 335 0 +DWIDTH 15 0 +BBX 13 40 0 -9 +BITMAP +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +F000 +FFF0 +FFF8 +FFF8 +FFF8 +FFF0 +0000 +0000 +0F00 +0F80 +0F80 +0F80 +0F80 +0F00 +0600 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 335 0 +DWIDTH 15 0 +BBX 16 35 -3 2 +BITMAP +F3C0 +FFC0 +FFC0 +7F80 +7F00 +3F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1F00 +1FFE +1FFF +1FFF +1FFF +1FFF +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 414 0 +DWIDTH 19 0 +BBX 18 31 -3 0 +BITMAP +038000 +07C000 +07C000 +07C000 +07C000 +07C000 +07C000 +07C000 +07C000 +07CC00 +07DE00 +07FE00 +07FE00 +07FC00 +07F800 +07F000 +07E000 +0FC000 +1FC000 +3FC000 +7FC000 +FFC000 +FFC000 +FFC000 +77C000 +07C000 +07C000 +07FFC0 +07FFC0 +07FFC0 +07FFC0 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 414 0 +DWIDTH 19 0 +BBX 18 30 -3 0 +BITMAP +038000 +07C000 +07C000 +07C000 +07C000 +07C000 +07C000 +07C000 +07C000 +07CC00 +07DE00 +07FE00 +07FE00 +07FC00 +07F800 +07F000 +07E000 +0FC000 +1FC000 +3FC000 +7FC000 +FFC000 +FFC000 +77C000 +07C000 +07C000 +07FFC0 +07FFC0 +07FFC0 +03FF80 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 410 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0060 +01F0 +07F0 +0FF0 +1FC0 +3F00 +1C00 +0000 +0000 +F01E +F01E +F81E +F81E +FC1E +FC1E +FC1E +FE1E +FE1E +FF1E +FF1E +FF9E +FF9E +FF9E +FFDE +FFDE +FBFE +FBFE +FBFE +F9FE +F9FE +F8FE +F8FE +F8FE +F87E +F87E +F83E +F83E +F83E +F81E +F01E +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 410 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0060 +01F0 +07F0 +0FF0 +1FC0 +3F00 +1C00 +0000 +0000 +F01E +F01E +F81E +F81E +FC1E +FC1E +FC1E +FE1E +FE1E +FF1E +FF1E +FF9E +FF9E +FF9E +FFDE +FFDE +FBFE +FBFE +FBFE +F9FE +F9FE +F8FE +F8FE +F8FE +F87E +F87E +F83E +F83E +F83E +F81E +F01E +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 410 0 +DWIDTH 19 0 +BBX 15 40 0 -9 +BITMAP +F01E +F01E +F81E +F81E +FC1E +FC1E +FC1E +FE1E +FE1E +FF1E +FF1E +FF9E +FF9E +FF9E +FFDE +FFDE +FBFE +FBFE +FBFE +F9FE +F9FE +F8FE +F8FE +F8FE +F87E +F87E +F83E +F83E +F83E +F81E +F01E +0000 +0000 +03C0 +03E0 +03E0 +03E0 +03E0 +03E0 +00C0 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 410 0 +DWIDTH 19 0 +BBX 15 40 0 -9 +BITMAP +F01E +F01E +F81E +F81E +FC1E +FC1E +FC1E +FE1E +FE1E +FF1E +FF1E +FF9E +FF9E +FF9E +FFDE +FFDE +FBFE +FBFE +FBFE +F9FE +F9FE +F8FE +F8FE +F8FE +F87E +F87E +F83E +F83E +F83E +F81E +F01E +0000 +0000 +03C0 +03E0 +03E0 +03E0 +03E0 +03E0 +00C0 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 410 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +1C70 +3EF8 +3FF8 +1FF0 +0FE0 +07C0 +03C0 +0000 +0000 +F01E +F01E +F81E +F81E +FC1E +FC1E +FC1E +FE1E +FE1E +FF1E +FF1E +FF9E +FF9E +FF9E +FFDE +FFDE +FBFE +FBFE +FBFE +F9FE +F9FE +F8FE +F8FE +F8FE +F87E +F87E +F83E +F83E +F83E +F81E +F01E +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 410 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +1C70 +3EF8 +3FF8 +1FF0 +0FE0 +07C0 +03C0 +0000 +0000 +F01E +F01E +F81E +F81E +FC1E +FC1E +FC1E +FE1E +FE1E +FF1E +FF1E +FF9E +FF9E +FF9E +FFDE +FFDE +FBFE +FBFE +FBFE +F9FE +F9FE +F8FE +F8FE +F8FE +F87E +F87E +F83E +F83E +F83E +F81E +F01E +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 38 0 0 +BITMAP +1FE0 +3FF8 +3FF8 +3FF8 +1FF0 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 38 0 0 +BITMAP +1FE0 +3FF8 +3FF8 +3FF8 +1FF0 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 39 0 0 +BITMAP +3C78 +3FF8 +3FF8 +3FF0 +1FF0 +07C0 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 15 39 0 0 +BITMAP +3C78 +3FF8 +3FF8 +3FF0 +1FF0 +07C0 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F83E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F81E +F83E +F83E +F83E +7FFC +7FFC +3FF8 +1FF0 +07E0 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 544 0 +DWIDTH 25 0 +BBX 21 31 0 0 +BITMAP +03FFF8 +0FFFF8 +1FFFF8 +3FFFF8 +3FFFF0 +7EF000 +7CF000 +F8F000 +F8F000 +F8F000 +F8F000 +F8F000 +F8F000 +F8FFF0 +F8FFF8 +F8FFF8 +F8FFF8 +F8FFF0 +F8F000 +F8F000 +F8F000 +F8F000 +F8F000 +F8F000 +7CF000 +7EF000 +7FFFE0 +3FFFF8 +1FFFF8 +0FFFF8 +03FFF8 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 544 0 +DWIDTH 25 0 +BBX 20 30 0 0 +BITMAP +01FFF0 +07FFF0 +1FFFF0 +3FFFF0 +3FFFE0 +7EF000 +7CF000 +78F000 +F8F000 +F8F000 +F8F000 +F8F000 +F8F000 +F8FFF0 +F8FFF0 +F8FFF0 +F8FFF0 +F8F000 +F8F000 +F8F000 +F8F000 +F8F000 +78F000 +7CF000 +7CF000 +7FF000 +3FFFF0 +1FFFF0 +0FFFF0 +03FFF0 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0060 +01F0 +07F0 +0FE0 +3FC0 +3F00 +1C00 +0000 +0000 +7FC0 +FFF0 +FFFC +FFFC +FFFE +F83E +F83E +F81E +F81E +F81E +F83E +F83E +F83E +FFFE +FFFC +FFFC +FFF8 +FFFC +F8FC +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F03C +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0060 +01F0 +07F0 +0FE0 +3FC0 +3F00 +1C00 +0000 +0000 +7FC0 +FFF0 +FFFC +FFFC +FFFE +F83E +F83E +F81E +F81E +F81E +F83E +F83E +F83E +FFFE +FFFC +FFFC +FFF8 +FFFC +F8FC +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F03C +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 -9 +BITMAP +7FC0 +FFF0 +FFFC +FFFC +FFFE +F83E +F83E +F81E +F81E +F81E +F83E +F83E +F83E +FFFE +FFFC +FFFC +FFF8 +FFFC +F8FC +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F03C +0000 +0000 +0380 +07C0 +07C0 +07C0 +07C0 +07C0 +0300 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 -9 +BITMAP +7FC0 +FFF0 +FFFC +FFFC +FFFE +F83E +F83E +F81E +F81E +F81E +F83E +F83E +F83E +FFFE +FFFC +FFFC +FFF8 +FFFC +F8FC +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F03C +0000 +0000 +0380 +07C0 +07C0 +07C0 +07C0 +07C0 +0300 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +18E0 +7DF0 +7FF0 +3FE0 +1FC0 +0FC0 +0780 +0000 +0000 +7FC0 +FFF0 +FFFC +FFFC +FFFE +F83E +F83E +F81E +F81E +F81E +F83E +F83E +F83E +FFFE +FFFC +FFFC +FFF8 +FFFC +F8FC +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F03C +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +18E0 +7DF0 +7FF0 +3FE0 +1FC0 +0FC0 +0780 +0000 +0000 +7FC0 +FFF0 +FFFC +FFFC +FFFE +F83E +F83E +F81E +F81E +F81E +F83E +F83E +F83E +FFFE +FFFC +FFFC +FFF8 +FFFC +F8FC +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F83E +F03C +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0020 +01F0 +07F0 +0FF0 +1FC0 +3F00 +1C00 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F81E +F81E +F81E +F81E +7C00 +7E00 +3F80 +1FC0 +0FE0 +07F0 +03F8 +01FC +007C +F07E +F83E +F81E +F81E +F83E +F83E +7FFE +7FFC +3FFC +1FF8 +0FE0 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0020 +01F0 +07F0 +0FF0 +1FC0 +3F00 +1C00 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F81E +F81E +F81E +F81E +7C00 +7E00 +3F80 +1FC0 +0FE0 +07F0 +03F8 +01FC +007C +F07E +F83E +F81E +F81E +F83E +F83E +7FFE +7FFC +3FFC +1FF8 +0FE0 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0380 +07C0 +0FE0 +1FF0 +1FF8 +3EF8 +1EF8 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F81E +F81E +F81E +F81E +7C00 +7E00 +3F80 +1FC0 +0FE0 +07F0 +03F8 +01FC +007C +F07E +F83E +F81E +F81E +F83E +F83E +7FFE +7FFC +3FFC +1FF8 +0FE0 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0380 +07C0 +0FE0 +1FF0 +1FF8 +3EF8 +1EF8 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F81E +F81E +F81E +F81E +7C00 +7E00 +3F80 +1FC0 +0FE0 +07F0 +03F8 +01FC +007C +F07E +F83E +F81E +F81E +F83E +F83E +7FFE +7FFC +3FFC +1FF8 +0FE0 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 41 0 -10 +BITMAP +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F81E +F81E +F81E +F81E +7C00 +7E00 +3F80 +1FC0 +0FE0 +07F0 +03F8 +01FC +007C +F07E +F83E +F81E +F81E +F83E +F83E +7FFE +7FFC +3FFC +1FF8 +0FE0 +0380 +0380 +03F0 +03F8 +03FC +00FC +0FFC +0FF8 +07F0 +03C0 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 41 0 -10 +BITMAP +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F81E +F81E +F81E +F81E +7C00 +7E00 +3F80 +1FC0 +0FE0 +07F0 +03F8 +01FC +007C +F07E +F83E +F81E +F81E +F83E +F83E +7FFE +7FFC +3FFC +1FF8 +0FE0 +0380 +0380 +03F0 +03F8 +03FC +00FC +0FFC +0FF8 +07F0 +03C0 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0C70 +3EF8 +1FF8 +1FF0 +0FE0 +07E0 +03C0 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F81E +F81E +F81E +F81E +7C00 +7E00 +3F80 +1FC0 +0FE0 +07F0 +03F8 +01FC +007C +F07E +F83E +F81E +F81E +F83E +F83E +7FFE +7FFC +3FFC +1FF8 +0FE0 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 398 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +0C70 +3EF8 +1FF8 +1FF0 +0FE0 +07E0 +03C0 +0000 +0000 +07E0 +1FF0 +3FF8 +7FFC +7FFC +F83E +F83E +F81E +F81E +F81E +F81E +7C00 +7E00 +3F80 +1FC0 +0FE0 +07F0 +03F8 +01FC +007C +F07E +F83E +F81E +F81E +F83E +F83E +7FFE +7FFC +3FFC +1FF8 +0FE0 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 401 0 +DWIDTH 18 0 +BBX 15 40 0 -9 +BITMAP +FFFE +FFFE +FFFE +FFFE +7FFC +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +0380 +0000 +0000 +03C0 +07C0 +07C0 +07C0 +07C0 +07C0 +0380 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 401 0 +DWIDTH 18 0 +BBX 15 40 0 -9 +BITMAP +FFFE +FFFE +FFFE +FFFE +7FFC +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +0380 +0000 +0000 +03C0 +07C0 +07C0 +07C0 +07C0 +07C0 +0380 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 401 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +1C70 +1EF8 +1FF8 +1FF0 +0FF0 +07E0 +03C0 +0000 +0000 +FFFE +FFFE +FFFE +FFFE +7FFC +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +0380 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 401 0 +DWIDTH 18 0 +BBX 15 40 0 0 +BITMAP +1C70 +1EF8 +1FF8 +1FF0 +0FF0 +07E0 +03C0 +0000 +0000 +FFFE +FFFE +FFFE +FFFE +7FFC +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +07C0 +0380 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 39 0 0 +BITMAP +0C00 +3F3C +7FFC +FFFC +FFFC +FBF8 +00E0 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 39 0 0 +BITMAP +0E00 +3F3C +7FFC +FFFC +FFFC +FBF8 +00E0 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FE0 +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 37 0 0 +BITMAP +3FF0 +3FF8 +3FF0 +3FF0 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 37 0 0 +BITMAP +3FF8 +3FF8 +3FF8 +1FF0 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FE0 +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 39 0 0 +BITMAP +3CF0 +3FF8 +3FF0 +3FF0 +1FE0 +0FC0 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 39 0 0 +BITMAP +3C70 +3FF8 +3FF8 +3FF0 +1FF0 +0FC0 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F83E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FE0 +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0300 +07C0 +0FC0 +0CE0 +0CE0 +0FC0 +0780 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FC0 +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 409 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0300 +07C0 +0FE0 +0CE0 +0EE0 +0FC0 +0780 +0000 +0000 +F01C +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F03E +F87E +FFFC +7FFC +7FF8 +3FF0 +0FE0 +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 560 0 +DWIDTH 26 0 +BBX 22 40 0 0 +BITMAP +003800 +007C00 +00FE00 +01FF00 +03FF00 +03EF80 +01EF00 +000000 +000000 +F0783C +F0783C +F8787C +F87C7C +F8FC7C +F8FC7C +78FC7C +78FC78 +7CFC78 +7CFEF8 +7DFEF8 +7DFEF8 +3DFEF8 +3DFEF0 +3DFEF0 +3FFFF0 +3FFFF0 +3FFFF0 +1FCFF0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +0F87E0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +070380 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 560 0 +DWIDTH 26 0 +BBX 22 40 0 0 +BITMAP +003800 +007C00 +00FE00 +01FF00 +03FF00 +03EF80 +01EF00 +000000 +000000 +F0783C +F0783C +F8787C +F87C7C +F8FC7C +F8FC7C +78FC7C +78FC78 +7CFC78 +7CFEF8 +7DFEF8 +7DFEF8 +3DFEF8 +3DFEF0 +3DFEF0 +3FFFF0 +3FFFF0 +3FFFF0 +1FCFF0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +0F87E0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +070380 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 17 40 -1 0 +BITMAP +01C000 +03E000 +07F000 +07F800 +0FFC00 +1F7C00 +0F3C00 +000000 +000000 +700700 +F80F80 +FC0F80 +7C1F00 +7C1F00 +3E3E00 +3E3E00 +1F7E00 +1F7C00 +1FFC00 +0FF800 +0FF800 +07F000 +07F000 +03F000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +01C000 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 17 40 -1 0 +BITMAP +01C000 +03E000 +07F000 +07F800 +0FFC00 +1F7C00 +0F3C00 +000000 +000000 +700700 +F80F80 +FC0F80 +7C1F00 +7C1F00 +3E3E00 +3E3E00 +1F7E00 +1F7C00 +1FFC00 +0FF800 +0FF800 +07F000 +07F000 +03F000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +01C000 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 17 38 -1 0 +BITMAP +0F3C00 +1F3C00 +1F7C00 +1F7C00 +0F3C00 +000000 +000000 +700700 +F80F80 +FC0F80 +7C1F00 +7C1F00 +3E3E00 +3E3E00 +1F7E00 +1F7C00 +1FFC00 +0FF800 +0FF800 +07F000 +07F000 +03F000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +01C000 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 411 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0030 +01F8 +07F8 +0FF0 +1FC0 +1F80 +1E00 +0000 +0000 +FFFE +FFFE +FFFE +FFFE +7FFE +007C +007C +00F8 +00F8 +01F8 +01F0 +01F0 +03E0 +03E0 +07C0 +07C0 +07C0 +0F80 +0F80 +1F00 +1F00 +3F00 +3E00 +3E00 +7C00 +7C00 +FFF8 +FFFE +FFFE +FFFE +FFFE +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 411 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +0030 +01F8 +07F8 +0FF0 +1FC0 +1F80 +1E00 +0000 +0000 +FFFE +FFFE +FFFE +FFFE +7FFE +007C +007C +00F8 +00F8 +01F8 +01F0 +01F0 +03E0 +03E0 +07C0 +07C0 +07C0 +0F80 +0F80 +1F00 +1F00 +3F00 +3E00 +3E00 +7C00 +7C00 +FFF8 +FFFE +FFFE +FFFE +FFFE +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 411 0 +DWIDTH 19 0 +BBX 15 38 0 0 +BITMAP +0380 +07C0 +07C0 +07C0 +07C0 +0000 +0000 +FFFE +FFFE +FFFE +FFFE +7FFE +007C +007C +00F8 +00F8 +01F8 +01F0 +01F0 +03E0 +03E0 +07C0 +07C0 +07C0 +0F80 +0F80 +1F00 +1F00 +3F00 +3E00 +3E00 +7C00 +7C00 +FFF8 +FFFE +FFFE +FFFE +FFFE +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 411 0 +DWIDTH 19 0 +BBX 15 38 0 0 +BITMAP +0380 +07C0 +07C0 +07C0 +07C0 +0000 +0000 +FFFE +FFFE +FFFE +FFFE +7FFE +007C +007C +00F8 +00F8 +01F8 +01F0 +01F0 +03E0 +03E0 +07C0 +07C0 +07C0 +0F80 +0F80 +1F00 +1F00 +3F00 +3E00 +3E00 +7C00 +7C00 +FFF8 +FFFE +FFFE +FFFE +FFFE +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 419 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +1C70 +3EF8 +3FF0 +1FF0 +0FE0 +07C0 +0780 +0000 +0000 +FFFE +FFFE +FFFE +FFFE +7FFE +007C +007C +00F8 +00F8 +01F8 +01F0 +01F0 +03E0 +03E0 +07C0 +07C0 +07C0 +0F80 +0F80 +1F00 +1F00 +3F00 +3E00 +3E00 +7C00 +7C00 +FFF8 +FFFE +FFFE +FFFE +FFFE +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 419 0 +DWIDTH 19 0 +BBX 15 40 0 0 +BITMAP +1C70 +3EF8 +3FF0 +1FF0 +0FE0 +07C0 +0780 +0000 +0000 +FFFE +FFFE +FFFE +FFFE +7FFE +007C +007C +00F8 +00F8 +01F8 +01F0 +01F0 +03E0 +03E0 +07C0 +07C0 +07C0 +0F80 +0F80 +1F00 +1F00 +3F00 +3E00 +3E00 +7C00 +7C00 +FFF8 +FFFE +FFFE +FFFE +FFFE +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 665 0 +DWIDTH 31 0 +BBX 26 40 0 0 +BITMAP +00003000 +0001F800 +0003F800 +000FF000 +001FC000 +001F8000 +001E0000 +00000000 +00000000 +0007FFC0 +0007FFC0 +000FFFC0 +000FFFC0 +001FFF80 +001F8000 +003F8000 +003F8000 +007F8000 +007F8000 +007F8000 +00FF8000 +00FF8000 +01F7FF80 +01F7FFC0 +03E7FFC0 +03E7FFC0 +07C7FF80 +07FF8000 +0FFF8000 +0FFF8000 +0FFF8000 +1FFF8000 +1F078000 +3E078000 +3E078000 +7C07FF80 +7C07FFC0 +F807FFC0 +F807FFC0 +7007FFC0 +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 665 0 +DWIDTH 31 0 +BBX 26 40 0 0 +BITMAP +00003000 +0001F800 +0003F800 +000FF000 +001FC000 +001F8000 +001E0000 +00000000 +00000000 +0007FFC0 +0007FFC0 +000FFFC0 +000FFFC0 +001FFF80 +001F8000 +003F8000 +003F8000 +007F8000 +007F8000 +007F8000 +00FF8000 +00FF8000 +01F7FF80 +01F7FFC0 +03E7FFC0 +03E7FFC0 +07C7FF80 +07FF8000 +0FFF8000 +0FFF8000 +0FFF8000 +1FFF8000 +1F078000 +3E078000 +3E078000 +7C07FF80 +7C07FFC0 +F807FFC0 +F807FFC0 +7007FFC0 +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 16 40 0 0 +BITMAP +0030 +01F8 +07F8 +0FF0 +1FC0 +3F00 +1C00 +0000 +0000 +07EE +1FFF +3FFF +7FFE +7FFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +7FFC +7FFC +FFF8 +FFF0 +F7E0 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 16 31 0 0 +BITMAP +07EE +1FFF +3FFF +7FFE +7FFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +FFFE +7FFC +7FFC +FFF8 +FFF0 +F7E0 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 237 0 +DWIDTH 11 0 +BBX 10 7 0 33 +BITMAP +1C00 +3E00 +7F00 +7F80 +FFC0 +FFC0 +F3C0 +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 232 0 +DWIDTH 11 0 +BBX 10 7 0 33 +BITMAP +E380 +F7C0 +FFC0 +FF80 +7F80 +3F00 +1E00 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 241 0 +DWIDTH 11 0 +BBX 11 6 0 33 +BITMAP +F3C0 +FFE0 +FFC0 +FFC0 +7F80 +3F00 +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 82 0 +DWIDTH 4 0 +BBX 5 5 -1 33 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 140 0 +DWIDTH 6 0 +BBX 7 7 -1 33 +BITMAP +3C +7E +7E +E6 +7E +7E +3C +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 319 0 +DWIDTH 15 0 +BBX 14 7 0 32 +BITMAP +1C00 +7F3C +FFFC +FFFC +FFF8 +F3F0 +0040 +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 560 0 +DWIDTH 26 0 +BBX 22 40 0 0 +BITMAP +00C000 +01F000 +01FC00 +00FF00 +007F80 +001F80 +000780 +000000 +000000 +F0783C +F0783C +F8787C +F87C7C +F8FC7C +F8FC7C +78FC7C +78FC78 +7CFC78 +7CFEF8 +7DFEF8 +7DFEF8 +3DFEF8 +3DFEF0 +3DFEF0 +3FFFF0 +3FFFF0 +3FFFF0 +1FCFF0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +0F87E0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +070380 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 560 0 +DWIDTH 26 0 +BBX 22 40 0 0 +BITMAP +00C000 +01F000 +01FC00 +00FF00 +007F80 +001F80 +000780 +000000 +000000 +F0783C +F0783C +F8787C +F87C7C +F8FC7C +F8FC7C +78FC7C +78FC78 +7CFC78 +7CFEF8 +7DFEF8 +7DFEF8 +3DFEF8 +3DFEF0 +3DFEF0 +3FFFF0 +3FFFF0 +3FFFF0 +1FCFF0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +0F87E0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +070380 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 560 0 +DWIDTH 26 0 +BBX 22 40 0 0 +BITMAP +000600 +001F00 +007F00 +00FF00 +01FC00 +03F000 +01C000 +000000 +000000 +F0783C +F0783C +F8787C +F87C7C +F8FC7C +F8FC7C +78FC7C +78FC78 +7CFC78 +7CFEF8 +7DFEF8 +7DFEF8 +3DFEF8 +3DFEF0 +3DFEF0 +3FFFF0 +3FFFF0 +3FFFF0 +1FCFF0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +0F87E0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +070380 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 560 0 +DWIDTH 26 0 +BBX 22 40 0 0 +BITMAP +000600 +001F00 +007F00 +00FF00 +01FC00 +03F000 +01C000 +000000 +000000 +F0783C +F0783C +F8787C +F87C7C +F8FC7C +F8FC7C +78FC7C +78FC78 +7CFC78 +7CFEF8 +7DFEF8 +7DFEF8 +3DFEF8 +3DFEF0 +3DFEF0 +3FFFF0 +3FFFF0 +3FFFF0 +1FCFF0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +0F87E0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +070380 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 560 0 +DWIDTH 26 0 +BBX 22 38 0 0 +BITMAP +01C700 +03EF80 +03EF80 +03EF80 +01C700 +000000 +000000 +F0783C +F0783C +F8787C +F87C7C +F8FC7C +F8FC7C +78FC7C +78FC78 +7CFC78 +7CFEF8 +7DFEF8 +7DFEF8 +3DFEF8 +3DFEF0 +3DFEF0 +3FFFF0 +3FFFF0 +3FFFF0 +1FCFF0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +0F87E0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +070380 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 560 0 +DWIDTH 26 0 +BBX 22 38 0 0 +BITMAP +01C700 +03EF80 +03EF80 +03EF80 +01C700 +000000 +000000 +F0783C +F0783C +F8787C +F87C7C +F8FC7C +F8FC7C +78FC7C +78FC78 +7CFC78 +7CFEF8 +7DFEF8 +7DFEF8 +3DFEF8 +3DFEF0 +3DFEF0 +3FFFF0 +3FFFF0 +3FFFF0 +1FCFF0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +1FCFE0 +0F87E0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +0F87C0 +070380 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 17 40 -1 0 +BITMAP +060000 +0FC000 +0FE000 +07F800 +01FC00 +00FC00 +003C00 +000000 +000000 +700700 +F80F80 +FC0F80 +7C1F00 +7C1F00 +3E3E00 +3E3E00 +1F7E00 +1F7C00 +1FFC00 +0FF800 +0FF800 +07F000 +07F000 +03F000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +01C000 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 406 0 +DWIDTH 19 0 +BBX 17 40 -1 0 +BITMAP +060000 +0FC000 +0FE000 +07F800 +01FC00 +00FC00 +003C00 +000000 +000000 +700700 +F80F80 +FC0F80 +7C1F00 +7C1F00 +3E3E00 +3E3E00 +1F7E00 +1F7C00 +1FFC00 +0FF800 +0FF800 +07F000 +07F000 +03F000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +03E000 +01C000 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 349 0 +DWIDTH 16 0 +BBX 13 5 0 13 +BITMAP +3FF0 +FFF8 +FFF8 +FFF8 +7FF8 +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 349 0 +DWIDTH 16 0 +BBX 13 5 0 13 +BITMAP +3FF0 +FFF8 +FFF8 +FFF8 +7FF8 +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 131 0 +DWIDTH 6 0 +BBX 4 7 0 24 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 131 0 +DWIDTH 6 0 +BBX 4 7 0 24 +BITMAP +F0 +F0 +F0 +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 200 0 +DWIDTH 9 0 +BBX 7 7 0 24 +BITMAP +FC +FE +FE +FE +FE +FE +FC +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 200 0 +DWIDTH 9 0 +BBX 7 7 0 24 +BITMAP +FC +FE +FE +FE +FE +FE +FC +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 155 0 +DWIDTH 7 0 +BBX 6 6 0 14 +BITMAP +78 +FC +FC +FC +FC +78 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 260 0 +DWIDTH 12 0 +BBX 15 31 -2 0 +BITMAP +001E +001E +003E +003E +007C +007C +007C +00F8 +00F8 +01F0 +01F0 +01F0 +03E0 +03E0 +07C0 +07C0 +07C0 +0F80 +0F80 +1F00 +1F00 +1F00 +3E00 +3E00 +7C00 +7C00 +7C00 +F800 +F800 +F000 +F000 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 370 0 +DWIDTH 17 0 +BBX 17 31 -2 0 +BITMAP +00FC00 +03FF00 +07FF80 +0FFF80 +1FFF80 +1F8700 +1F0000 +1F0000 +1E0000 +1E0000 +3E0000 +FFFC00 +FFFC00 +FFFC00 +7FFC00 +1E0000 +1E0000 +1E0000 +7FFC00 +FFFC00 +FFFC00 +7FFC00 +1E0000 +1E0000 +1F0200 +1F0780 +1FFF80 +0FFF80 +07FF80 +03FE00 +00FC00 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 650 0 +DWIDTH 30 0 +BBX 28 13 0 18 +BITMAP +7FF18060 +FFF3C0F0 +FFF3E0F0 +7FF3E1F0 +0F03F1F0 +0F03F3F0 +0F03F3F0 +0F03FFF0 +0F03FFF0 +0F03DEF0 +0F03DEF0 +0F03DEF0 +07018C70 +ENDCHAR +STARTCHAR commaaccent +ENCODING 63171 +SWIDTH 260 0 +DWIDTH 12 0 +BBX 5 7 3 -9 +BITMAP +70 +F8 +F8 +F8 +F8 +F8 +20 +ENDCHAR +STARTCHAR Acute +ENCODING 63177 +SWIDTH 247 0 +DWIDTH 11 0 +BBX 10 7 0 33 +BITMAP +03C0 +0FC0 +3FC0 +7F80 +FE00 +FC00 +6000 +ENDCHAR +STARTCHAR Caron +ENCODING 63178 +SWIDTH 232 0 +DWIDTH 11 0 +BBX 10 7 0 33 +BITMAP +E380 +F7C0 +FFC0 +FF80 +7F80 +3F00 +1E00 +ENDCHAR +STARTCHAR Dieresis +ENCODING 63179 +SWIDTH 229 0 +DWIDTH 11 0 +BBX 10 5 0 33 +BITMAP +F3C0 +F3C0 +F3C0 +F3C0 +F3C0 +ENDCHAR +STARTCHAR Grave +ENCODING 63182 +SWIDTH 222 0 +DWIDTH 10 0 +BBX 10 7 0 33 +BITMAP +6000 +FC00 +FE00 +7F80 +1FC0 +0FC0 +03C0 +ENDCHAR +STARTCHAR Macron +ENCODING 63184 +SWIDTH 231 0 +DWIDTH 11 0 +BBX 10 5 0 33 +BITMAP +7F80 +FFC0 +FFC0 +FFC0 +FFC0 +ENDCHAR +STARTCHAR uniF8FF +ENCODING 63743 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR .notdef +ENCODING -1 +SWIDTH 210 0 +DWIDTH 10 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR Ring +ENCODING -1 +SWIDTH 140 0 +DWIDTH 6 0 +BBX 7 7 -1 33 +BITMAP +3C +7E +7E +E6 +7E +7E +3C +ENDCHAR +STARTCHAR Tilde +ENCODING -1 +SWIDTH 319 0 +DWIDTH 15 0 +BBX 14 7 0 29 +BITMAP +1C00 +7F18 +FFFC +FFFC +FFFC +F3F8 +01E0 +ENDCHAR +STARTCHAR Circumflex +ENCODING -1 +SWIDTH 237 0 +DWIDTH 11 0 +BBX 10 7 0 33 +BITMAP +1C00 +3E00 +7F00 +7F80 +FFC0 +FFC0 +F3C0 +ENDCHAR +STARTCHAR Cedilla +ENCODING -1 +SWIDTH 201 0 +DWIDTH 9 0 +BBX 9 11 0 -10 +BITMAP +3800 +3800 +3C00 +3F00 +3F80 +3F80 +8780 +FF80 +FF80 +FF00 +1800 +ENDCHAR +STARTCHAR commaaccent.cap +ENCODING -1 +SWIDTH 260 0 +DWIDTH 12 0 +BBX 5 6 3 -8 +BITMAP +70 +F8 +F8 +F8 +F8 +F0 +ENDCHAR +STARTCHAR Breve +ENCODING -1 +SWIDTH 241 0 +DWIDTH 11 0 +BBX 11 6 0 33 +BITMAP +F3C0 +FFE0 +FFC0 +FFC0 +7F80 +3F00 +ENDCHAR +ENDFONT diff --git a/Espresso_Water_Meter/code.py b/Espresso_Water_Meter/code.py new file mode 100644 index 000000000..fba430e16 --- /dev/null +++ b/Espresso_Water_Meter/code.py @@ -0,0 +1,280 @@ +# SPDX-FileCopyrightText: 2025 John Park for Adafruit Industries +# +# SPDX-License-Identifier: MIT +''' +Espresso Tank Meter +Feather ESP32-S2 with RCWL-1601 Ultrasonic distance sensor +''' + +import time +import os +import ssl +import microcontroller +import supervisor +import socketpool +import wifi +import board +import digitalio +import alarm +import neopixel +import adafruit_hcsr04 +import adafruit_minimqtt.adafruit_minimqtt as MQTT +from adafruit_io.adafruit_io import IO_MQTT +import adafruit_requests +import adafruit_max1704x + +# Initialize the power pin for the sensor +sensor_power = digitalio.DigitalInOut(board.A2) +sensor_power.direction = digitalio.Direction.OUTPUT +sensor_power.value = False # Start with sensor powered off + +def power_sensor_on(): + """Turn on power to the ultrasonic sensor and wait for it to stabilize.""" + sensor_power.value = True + time.sleep(0.55) # Give sensor time to power up and stabilize + +def power_sensor_off(): + """Turn off power to the ultrasonic sensor.""" + sensor_power.value = False + +# Initialize the sonar sensor +sonar = adafruit_hcsr04.HCSR04(trigger_pin=board.A0, echo_pin=board.A1) + +# Initialize the battery monitor +i2c = board.I2C() # uses board.SCL and board.SDA +battery_monitor = adafruit_max1704x.MAX17048(i2c) + +# Define colors (hex values) +WHITE = 0xFFFFFF +BLUE = 0x0000FF +GREEN = 0x00FF00 +YELLOW = 0xFFFF00 +RED = 0xFF0000 +PINK = 0xbb00bb +CYAN = 0x00bbbb +OFF = 0x000000 + +# Initialize the NeoPixel +pixel = neopixel.NeoPixel(board.NEOPIXEL, 1, brightness=0.25) +# Show yellow on startup +pixel.fill(YELLOW) + +# Operating hours (24-hour format with minutes, e.g., "6:35" and "16:00") +OPENING_TIME = "6:00" +CLOSING_TIME = "15:30" +# Normal operation check interval +NORMAL_CHECK_MINUTES = 10 +# Sleep duration in seconds during operating hours +SLEEP_DURATION = 60 * NORMAL_CHECK_MINUTES +# Display duration in seconds +DISPLAY_DURATION = 1 +# Number of samples to average +NUM_SAMPLES = 5 + +def parse_time(time_str): + """Convert time string (HH:MM format) to hours and minutes.""" + # pylint: disable=redefined-outer-name + parts = time_str.split(':') + return int(parts[0]), int(parts[1]) + +def get_average_distance(): + """Take multiple distance readings and return the average.""" + power_sensor_on() # Power on the sensor before taking measurements + distances = [] + for _ in range(NUM_SAMPLES): + try: + distance = sonar.distance + distances.append(distance) + time.sleep(0.1) # Short delay between readings + except RuntimeError: + print("Error reading distance") + continue + power_sensor_off() # Power off the sensor after measurements + + # Only average valid readings + if distances: + return sum(distances) / len(distances) + return None + +def set_pixel_color(distance): + """Set NeoPixel color based on distance.""" + if distance is None: + pixel.fill(OFF) + return + + if distance < 2: + pixel.fill(WHITE) + elif 2 <= distance < 10: + pixel.fill(BLUE) + elif 10 <= distance < 16: + pixel.fill(GREEN) + elif 18 <= distance < 20: + pixel.fill(YELLOW) + else: # distance >= 22 + pixel.fill(RED) + +# Wait for things to settle before reading sonar +time.sleep(0.1) + +# Get average distance +avg_distance = get_average_distance() + +if avg_distance is not None: + + if avg_distance >= 22: + # pylint: disable=invalid-name + avg_distance = 22 + print(f"Average distance: {avg_distance:.1f} cm") + # Set color based on average distance + set_pixel_color(avg_distance) + + # Check battery status + battery_voltage = battery_monitor.cell_voltage + battery_percent = battery_monitor.cell_percent + print(f"Battery: {battery_percent:.1f}% ({battery_voltage:.2f}V)") + + # Try connecting to WiFi + try: + + print("Connecting to %s" % os.getenv("CIRCUITPY_WIFI_SSID")) + # Show pink while attempting to connect + pixel.fill(PINK) + wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD")) + print("Connected to %s" % os.getenv("CIRCUITPY_WIFI_SSID")) + # Show cyan on successful connection + pixel.fill(CYAN) + time.sleep(1) # Brief pause to show the connection success + # pylint: disable=broad-except + except Exception as e: + print("Failed to connect to WiFi. Error:", e, "\nBoard will hard reset in 30 seconds.") + pixel.fill(OFF) + time.sleep(10) + microcontroller.reset() + + # Create a socket pool + pool = socketpool.SocketPool(wifi.radio) + requests = adafruit_requests.Session(pool, ssl.create_default_context()) + + # Initialize a new MQTT Client object + mqtt_client = MQTT.MQTT( + broker="io.adafruit.com", + username=os.getenv("ADAFRUIT_AIO_USERNAME"), + password=os.getenv("ADAFRUIT_AIO_KEY"), + socket_pool=pool, + ssl_context=ssl.create_default_context(), + ) + + # Initialize Adafruit IO MQTT "helper" + io = IO_MQTT(mqtt_client) + + try: + # If Adafruit IO is not connected... + if not io.is_connected: + print("Connecting to Adafruit IO...") + io.connect() + + # Get current time from AIO time service + aio_username = os.getenv("ADAFRUIT_AIO_USERNAME") + aio_key = os.getenv("ADAFRUIT_AIO_KEY") + timezone = os.getenv("TIMEZONE") + # pylint: disable=line-too-long + TIME_URL = f"https://io.adafruit.com/api/v2/{aio_username}/integrations/time/strftime?x-aio-key={aio_key}&tz={timezone}" + TIME_URL += "&fmt=%25Y-%25m-%25d+%25H%3A%25M%3A%25S.%25L+%25j+%25u+%25z+%25Z" + + print("Getting time from Adafruit IO...") + response = requests.get(TIME_URL) + time_str = response.text.strip() # Remove any leading/trailing whitespace + print("Current time:", time_str) + + # Parse the current time from the time string + time_parts = time_str.split() + current_time = time_parts[1].split(':') + current_hour = int(current_time[0]) + current_minute = int(current_time[1]) + + # Get opening and closing hours and minutes + opening_hour, opening_minute = parse_time(OPENING_TIME) + closing_hour, closing_minute = parse_time(CLOSING_TIME) + + # Convert all times to minutes for easier comparison + current_minutes = current_hour * 60 + current_minute + opening_minutes = opening_hour * 60 + opening_minute + closing_minutes = closing_hour * 60 + closing_minute + + # Check if we're within operating hours + if opening_minutes <= current_minutes < closing_minutes: + print(f"Within operating hours ({OPENING_TIME} to {CLOSING_TIME}), proceeding with measurement") + + # Explicitly pump the message loop + io.loop() + + # Send the distance data + print(f"Publishing {avg_distance:.1f} to espresso water level feed") + io.publish("espresso-water-tank-level", f"{avg_distance:.1f}") + + # Send the battery data + print(f"Publishing {battery_percent:.1f} to battery level feed") + io.publish("espresso-water-sensor-battery", f"{battery_percent:.1f}") + + + # Make sure the message gets sent + io.loop() + + print("Water level sent successfully") + + # Keep NeoPixel lit for DISPLAY_DURATION seconds + time.sleep(DISPLAY_DURATION) + + # Use normal check interval during operating hours + # # pylint: disable=invalid-name + sleep_seconds = SLEEP_DURATION + print(f"Next check in {NORMAL_CHECK_MINUTES} minutes") + else: + print(f"Outside operating hours ({OPENING_TIME} to {CLOSING_TIME}), going back to sleep") + # Calculate time until next opening + if current_minutes >= closing_minutes: + # After closing, calculate time until opening tomorrow + minutes_until_open = (24 * 60 - current_minutes) + opening_minutes + else: + # Before opening, calculate time until opening today + minutes_until_open = opening_minutes - current_minutes + + # Convert minutes to seconds for sleep duration + sleep_seconds = minutes_until_open * 60 + hours_until_open = minutes_until_open // 60 + minutes_remaining = minutes_until_open % 60 + if minutes_remaining: + print(f"Sleeping until {OPENING_TIME} ({hours_until_open} hours, {minutes_remaining} minutes)") + else: + print(f"Sleeping until {OPENING_TIME} ({hours_until_open} hours)") + + response.close() + + # pylint: disable=broad-except + except Exception as e: + print("Failed to get or send data, or connect. Error:", e, + "\nBoard will hard reset in 30 seconds.") + pixel.fill(OFF) + time.sleep(30) + microcontroller.reset() + +else: + print("Failed to get valid distance readings") + pixel.fill(OFF) + # pylint: disable=invalid-name + sleep_seconds = SLEEP_DURATION # Use normal interval if we couldn't get readings + +# Prepare for deep sleep +power_sensor_off() # Make sure sensor is powered off before sleep +pixel.brightness = 0 # Turn off NeoPixel + +# Flush the serial output before sleep +# pylint: disable=pointless-statement +supervisor.runtime.serial_bytes_available +time.sleep(0.05) + +# Create time alarm +time_alarm = alarm.time.TimeAlarm(monotonic_time=time.monotonic() + sleep_seconds) + +# Enter deep sleep +alarm.exit_and_deep_sleep_until_alarms(time_alarm) diff --git a/MEMENTO/Arduino_Basic_Camera/.pycamera_s3.generate b/Factory_Tests/Adafruit_ESP32-C6_Feather_FactoryTest/.feather_esp32c6.test.only similarity index 100% rename from MEMENTO/Arduino_Basic_Camera/.pycamera_s3.generate rename to Factory_Tests/Adafruit_ESP32-C6_Feather_FactoryTest/.feather_esp32c6.test.only diff --git a/Factory_Tests/Adafruit_ESP32-C6_Feather_FactoryTest/Adafruit_ESP32-C6_Feather_FactoryTest.ino b/Factory_Tests/Adafruit_ESP32-C6_Feather_FactoryTest/Adafruit_ESP32-C6_Feather_FactoryTest.ino new file mode 100644 index 000000000..1272f0844 --- /dev/null +++ b/Factory_Tests/Adafruit_ESP32-C6_Feather_FactoryTest/Adafruit_ESP32-C6_Feather_FactoryTest.ino @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2024 ladyada for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include "Adafruit_TestBed.h" +extern Adafruit_TestBed TB; + +Adafruit_NeoPixel pixel(1, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800); + +void setup() { + //while (! Serial) delay(10); + Serial.begin(115200); + TB.neopixelPin = PIN_NEOPIXEL; + TB.neopixelNum = 1; + TB.begin(); + TB.setColor(WHITE); +} + +uint8_t j = 0; + +void loop() { + + TB.setColor(TB.Wheel(j++)); + delay(10); + if (j == 0) { + TB.printI2CBusScan(); + } + +} diff --git a/MEMENTO/Memento_Cat_Printer/.pycamera_s3.generate b/Factory_Tests/Adafruit_Sparkle_Motion_Mini_FactoryTest/.feather_esp32_v2.test.only similarity index 100% rename from MEMENTO/Memento_Cat_Printer/.pycamera_s3.generate rename to Factory_Tests/Adafruit_Sparkle_Motion_Mini_FactoryTest/.feather_esp32_v2.test.only diff --git a/Factory_Tests/Adafruit_Sparkle_Motion_Mini_FactoryTest/Adafruit_Sparkle_Motion_Mini_FactoryTest.ino b/Factory_Tests/Adafruit_Sparkle_Motion_Mini_FactoryTest/Adafruit_Sparkle_Motion_Mini_FactoryTest.ino new file mode 100644 index 000000000..4450f0927 --- /dev/null +++ b/Factory_Tests/Adafruit_Sparkle_Motion_Mini_FactoryTest/Adafruit_Sparkle_Motion_Mini_FactoryTest.ino @@ -0,0 +1,83 @@ +// SPDX-FileCopyrightText: 2025 Limor Fried for Adafruit Industries +// +// SPDX-License-Identifier: MIT +#include +#include "WiFi.h" +#include +#include "ESP_I2S.h" +extern Adafruit_TestBed TB; + +// I2S pin definitions +const uint8_t I2S_SCK = 23; // BCLK +const uint8_t I2S_WS = 10; // LRCLK +const uint8_t I2S_DIN = 9; // DATA_IN +I2SClass i2s; + +// the setup routine runs once when you press reset: +void setup() { + Serial.begin(115200); + pinMode(LED_BUILTIN, OUTPUT); + digitalWrite(LED_BUILTIN, HIGH); + i2s.setPins(I2S_SCK, I2S_WS, -1, I2S_DIN); + if (!i2s.begin(I2S_MODE_STD, 44100, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO, I2S_STD_SLOT_LEFT)) { + Serial.println("Failed to initialize I2S bus!"); + return; + } + // TestBed will handle the neopixel swirl for us + TB.neopixelPin = PIN_NEOPIXEL; + TB.neopixelNum = 1; + TB.begin(); + + // Set WiFi to station mode and disconnect from an AP if it was previously connected + WiFi.mode(WIFI_STA); + WiFi.disconnect(); +} + +// the loop routine runs over and over again forever: +uint8_t wheelColor=0; +void loop() { + if (wheelColor == 0) { + // Test I2C! + Serial.print("I2C port "); + TB.theWire = &Wire; + TB.printI2CBusScan(); + + // Test WiFi Scan! + // WiFi.scanNetworks will return the number of networks found + int n = WiFi.scanNetworks(); + Serial.print("WiFi AP scan done..."); + if (n == 0) { + Serial.println("no networks found"); + } else { + Serial.print(n); + Serial.println(" networks found"); + for (int i = 0; i < n; ++i) { + // Print SSID and RSSI for each network found + Serial.print(i + 1); + Serial.print(": "); + Serial.print(WiFi.SSID(i)); + Serial.print(" ("); + Serial.print(WiFi.RSSI(i)); + Serial.print(")"); + Serial.println((WiFi.encryptionType(i) == WIFI_AUTH_OPEN)?" ":"*"); + delay(10); + } + } + Serial.println(""); + for (int i=0; i < 5; i++) { + int32_t sample = i2s.read(); + if (sample >= 0){ + Serial.print("Amplitude: "); + Serial.println(sample); + + // Delay to avoid printing too quickly + delay(200); + } + } + } + + TB.setColor(TB.Wheel(wheelColor++)); // swirl NeoPixel + digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN)); + + delay(5); +} diff --git a/Mini_GIF_Players/.feather_rp2040.test.only b/Factory_Tests/Feather_RP2040_Adalogger/.feather_rp2040_adalogger.test.only similarity index 100% rename from Mini_GIF_Players/.feather_rp2040.test.only rename to Factory_Tests/Feather_RP2040_Adalogger/.feather_rp2040_adalogger.test.only diff --git a/Factory_Tests/Feather_RP2040_Adalogger/Feather_RP2040_Adalogger.ino b/Factory_Tests/Feather_RP2040_Adalogger/Feather_RP2040_Adalogger.ino new file mode 100644 index 000000000..ea74524b6 --- /dev/null +++ b/Factory_Tests/Feather_RP2040_Adalogger/Feather_RP2040_Adalogger.ino @@ -0,0 +1,66 @@ +// SPDX-FileCopyrightText: 2024 ladyada for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include +#include "Adafruit_TestBed.h" + +SdFat SD; +SdFile file; +SdSpiConfig config(PIN_SD_DAT3_CS, DEDICATED_SPI, SD_SCK_MHZ(16), &SPI1); + +extern Adafruit_TestBed TB; + +bool card_state = false; + +void setup() { + Serial.begin(115200); + //while (!Serial) { yield(); delay(10); } // wait till serial port is opened + delay(100); // RP2040 delay is not a bad idea + + TB.neopixelPin = 17; + TB.neopixelNum = 1; + TB.begin(); + + pinMode(PIN_CARD_DETECT, INPUT_PULLUP); +} + +uint8_t x = 0; +void loop() { + + TB.setColor(TB.Wheel(x++)); + delay(10); + + if (card_state && !digitalRead(PIN_CARD_DETECT)) { + Serial.println("Card removed"); + card_state = digitalRead(PIN_CARD_DETECT); + } + + if (!card_state && digitalRead(PIN_CARD_DETECT)) { + Serial.println("Card inserted"); + card_state = digitalRead(PIN_CARD_DETECT); + delay(100); + + if (!SD.begin(config)) { + Serial.println("SD card initialization failed!"); + return; + } + Serial.println("SD card initialized OK!"); + + // Print the SD card details + uint32_t size = SD.card()->sectorCount(); + if (size == 0) { + Serial.printf("Can't determine the card size.\n"); + return; + } + uint32_t sizeMB = 0.000512 * size + 0.5; + Serial.printf("Card size: %lu MB (MB = 1,000,000 bytes)\n", sizeMB); + Serial.printf("\nVolume is FAT%d, Cluster size (bytes): %lu\n\n", int(SD.vol()->fatType()), SD.vol()->bytesPerCluster()); + + SD.ls(LS_R | LS_DATE | LS_SIZE); + } + + return; + +} diff --git a/Factory_Tests/Metro_ESP32S2_FactoryTest/.feather_esp32s2.test.only b/Factory_Tests/Metro_ESP32S2_FactoryTest/.feather_esp32s2.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Factory_Tests/Metro_ESP32S2_FactoryTest/Metro_ESP32S2_FactoryTest.ino b/Factory_Tests/Metro_ESP32S2_FactoryTest/Metro_ESP32S2_FactoryTest.ino new file mode 100644 index 000000000..fd9555a49 --- /dev/null +++ b/Factory_Tests/Metro_ESP32S2_FactoryTest/Metro_ESP32S2_FactoryTest.ino @@ -0,0 +1,33 @@ +// SPDX-FileCopyrightText: 2022 Limor Fried for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include +#include "Adafruit_TestBed.h" + +extern Adafruit_TestBed TB; + +void setup() { + Serial.begin(115200); + // while (! Serial) delay(10); + + delay(100); + + TB.neopixelPin = PIN_NEOPIXEL; + TB.neopixelNum = 1; + TB.begin(); + TB.setColor(WHITE); +} + +uint8_t j = 0; + +void loop() { + + if (j % 10 == 0) { + TB.printI2CBusScan(); + } + TB.setColor(TB.Wheel(j++)); + delay(100); + return; +} diff --git a/Factory_Tests/Pixel_Trinkey_FactoryTest/.pixeltrinkey_m0.test.only b/Factory_Tests/Pixel_Trinkey_FactoryTest/.pixeltrinkey_m0.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Factory_Tests/Pixel_Trinkey_FactoryTest/Pixel_Trinkey_FactoryTest.ino b/Factory_Tests/Pixel_Trinkey_FactoryTest/Pixel_Trinkey_FactoryTest.ino new file mode 100644 index 000000000..e88d0a6ce --- /dev/null +++ b/Factory_Tests/Pixel_Trinkey_FactoryTest/Pixel_Trinkey_FactoryTest.ino @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2024 ladyada for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include + +#define NUMPIXELS 64 +Adafruit_DotStar dotstrip(NUMPIXELS, PIN_DATA, PIN_CLOCK, DOTSTAR_BRG); +Adafruit_NeoPixel neostrip(NUMPIXELS, PIN_DATA, NEO_GRB + NEO_KHZ800); +Adafruit_NeoPixel pixel(1, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800); // internal board pixel + +void setup() { + Serial.begin(115200); + + dotstrip.begin(); + dotstrip.setBrightness(25); + dotstrip.show(); + + neostrip.begin(); + neostrip.setBrightness(25); + neostrip.show(); + + pixel.begin(); + pixel.setBrightness(25); + pixel.show(); +} + +uint16_t firstPixelHue = 0; +bool which_strip = false; + +void loop() { + firstPixelHue += 256; + + if (which_strip == true) { + // neopixel + for(int i=0; i +#include +#include + + +Adafruit_SHT4x sht4 = Adafruit_SHT4x(); +Adafruit_NeoPixel pixel(1, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800); +Adafruit_FreeTouch touch = Adafruit_FreeTouch(1, OVERSAMPLE_4, RESISTOR_50K, FREQ_MODE_NONE); + +void setup() { + Serial.begin(115200); + + pixel.begin(); // Initialize pins for output + pixel.setBrightness(10); + pixel.show(); // Turn off ASAP + + uint8_t i=0; + while (!Serial) { + // swirl the neopix while we wait + pixel.setPixelColor(0, Wheel(i++)); + pixel.show(); + delay(10); // will pause until serial console opens + } + pixel.setPixelColor(0, 0); + pixel.show(); + + if (! touch.begin()) + Serial.println("Failed to begin QTouch on pin 1"); + + Serial.println("# Adafruit SHT4x Trinkey Factory Test"); + if (! sht4.begin()) { + Serial.println("# Couldn't find SHT4x"); + while (1) delay(1); + } + Serial.print("# Found SHT4x sensor. "); + Serial.print("Serial number 0x"); + Serial.println(sht4.readSerial(), HEX); + + sht4.setPrecision(SHT4X_HIGH_PRECISION); + sht4.setHeater(SHT4X_NO_HEATER); + Serial.println("# Serial number, Temperature in *C, Relative Humidity %, Touch"); +} + + +void loop() { + sensors_event_t humidity, temp; + + uint32_t timestamp = millis(); + sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data + timestamp = millis() - timestamp; + + Serial.print(sht4.readSerial()); + Serial.print(", "); + Serial.print(temp.temperature); + Serial.print(", "); + Serial.print(humidity.relative_humidity); + Serial.print(", "); + Serial.println(touch.measure()); + + // blink! + pixel.setPixelColor(0, 0x0000FF); + pixel.show(); + delay(25); + pixel.setPixelColor(0, 0x0); + pixel.show(); + + // 1 second between readings + delay(1000); +} + + +// Input a value 0 to 255 to get a color value. +// The colours are a transition r - g - b - back to r. +uint32_t Wheel(byte WheelPos) { + WheelPos = 255 - WheelPos; + if(WheelPos < 85) { + return pixel.Color(255 - WheelPos * 3, 0, WheelPos * 3); + } + if(WheelPos < 170) { + WheelPos -= 85; + return pixel.Color(0, WheelPos * 3, 255 - WheelPos * 3); + } + WheelPos -= 170; + return pixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0); +} diff --git a/Factory_Tests/TRRS_Trinkey_FactoryTest/.none.test.only b/Factory_Tests/TRRS_Trinkey_FactoryTest/.none.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Factory_Tests/TRRS_Trinkey_FactoryTest/TRRS_Trinkey_FactoryTest.ino b/Factory_Tests/TRRS_Trinkey_FactoryTest/TRRS_Trinkey_FactoryTest.ino new file mode 100644 index 000000000..0134cbefe --- /dev/null +++ b/Factory_Tests/TRRS_Trinkey_FactoryTest/TRRS_Trinkey_FactoryTest.ino @@ -0,0 +1,131 @@ +// SPDX-FileCopyrightText: 2024 ladyada for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include "SdFat.h" +#include "Adafruit_TestBed.h" +#include "Adafruit_TinyUSB.h" + +// HID report descriptor using TinyUSB's template +// Single Report (no ID) descriptor +uint8_t const desc_hid_report[] = { + TUD_HID_REPORT_DESC_KEYBOARD() +}; + +Adafruit_USBD_HID usb_hid; + +#define TIP_KEYCODE HID_KEY_SPACE +#define RING_KEYCODE HID_KEY_ENTER + + +extern Adafruit_TestBed TB; +uint8_t allpins[] = {PIN_TIP, PIN_RING1, PIN_RING2, PIN_SLEEVE}; + +bool cableinserted = false; +bool last_cablestate = false; +uint32_t last_i2cscan = 0; + +void setup() { + Serial.begin(115200); + //while (!Serial) { yield(); delay(10); } // wait till serial port is opened + + usb_hid.setBootProtocol(HID_ITF_PROTOCOL_KEYBOARD); + usb_hid.setPollInterval(2); + usb_hid.setReportDescriptor(desc_hid_report, sizeof(desc_hid_report)); + usb_hid.setStringDescriptor("TinyUSB Keyboard"); + usb_hid.begin(); + + + TB.neopixelPin = PIN_NEOPIXEL; + TB.neopixelNum = NUM_NEOPIXEL; + TB.begin(); +} + +void loop() { + delay(10); // sample every 10 ms + + uint8_t keycode[6] = { 0 }; + uint8_t count = 0; + // used to avoid send multiple consecutive zero report for keyboard + static bool keyPressedPreviously = false; + + pinMode(PIN_TIP, OUTPUT); + digitalWrite(PIN_TIP, LOW); + pinMode(PIN_TIP_SWITCH, INPUT_PULLUP); + cableinserted = digitalRead(PIN_TIP_SWITCH); + + if (!cableinserted) { + TB.setColor(RED); + } + + if (cableinserted && !last_cablestate) { + TB.setColor(GREEN); + delay(250); // give em a quarter second to plug completely + } + + last_cablestate = cableinserted; + + // Wake up host if we are in suspend mode + if ( TinyUSBDevice.suspended() && count ) { + TinyUSBDevice.remoteWakeup(); + } + // skip if hid is not ready e.g still transferring previous report + if ( !usb_hid.ready() ) return; + + if (!cableinserted) { + keyPressedPreviously = false; + usb_hid.keyboardRelease(0); + + // do an I2C scan while we're here, if we have pullups on SDA/SCL + if ((millis() - last_i2cscan) > 1000) { + TB.disableI2C(); + if (TB.testPullup(SDA) && TB.testPullup(SCL)) { + Wire.begin(); + TB.printI2CBusScan(); + } else { + Serial.println("No pullups on SDA/SCL"); + } + last_i2cscan = millis(); + } + return; + } + // make two inputs + pinMode(PIN_TIP, INPUT_PULLUP); + pinMode(PIN_RING1, INPUT_PULLUP); + + // make two 'ground' pins + pinMode(PIN_SLEEVE, OUTPUT); + digitalWrite(PIN_SLEEVE, LOW); + pinMode(PIN_RING2, OUTPUT); + digitalWrite(PIN_RING2, LOW); + + delay(1); + + if (!digitalRead(PIN_TIP)) { + keycode[0] = TIP_KEYCODE; + count++; + } + if (!digitalRead(PIN_RING1)) { + keycode[1] = RING_KEYCODE; + count++; + } + + if (count) { // Send report if there is key pressed + uint8_t const report_id = 0; + uint8_t const modifier = 0; + + keyPressedPreviously = true; + usb_hid.keyboardReport(report_id, modifier, keycode); + } + else + { + // Send All-zero report to indicate there is no keys pressed + // Most of the time, it is, though we don't need to send zero report + // every loop(), only a key is pressed in previous loop() + if ( keyPressedPreviously ) + { + keyPressedPreviously = false; + usb_hid.keyboardRelease(0); + } + } +} diff --git a/FeatherCAN_CircuitPython/listener-ack/code.py b/FeatherCAN_CircuitPython/listener-ack/code.py index 8b669ba05..23995c169 100644 --- a/FeatherCAN_CircuitPython/listener-ack/code.py +++ b/FeatherCAN_CircuitPython/listener-ack/code.py @@ -50,5 +50,5 @@ while True: if gap != 1: print(f"gap: {gap}") - print("Sending ACK") + print(f"Sending ACK: {count}") can.send(canio.Message(id=0x409, data=struct.pack(" DVIGFX16 display(DVI_RES_320x240p60, adafruit_feather_dvi_cfg); @@ -681,7 +683,7 @@ void make_triangle(uint16_t x1, uint16_t y1, uint16_t side_1, uint16_t side_2,ui } int analog_map(int x, int minMap, int maxMap) { - int z = analogRead(x); + long unsigned int z = analogRead(x); z = map(z, 0, 1023, minMap, maxMap); return z; } @@ -726,7 +728,7 @@ void draw_gradient(int x, int y, int w, int h) { } } -void millisDelay( long int delayTime){ - long int start_time = millis(); +void millisDelay(long unsigned int delayTime){ + long unsigned int start_time = millis(); while ( millis() - start_time < delayTime) ; } diff --git a/Feather_ESP32-S2_TFT_Azure/code.py b/Feather_ESP32-S2_TFT_Azure/code.py index 8ba8d7c5a..64c3f1135 100644 --- a/Feather_ESP32-S2_TFT_Azure/code.py +++ b/Feather_ESP32-S2_TFT_Azure/code.py @@ -13,11 +13,13 @@ import socketpool import wifi import displayio import adafruit_ntp +import adafruit_connection_manager from adafruit_display_text import bitmap_label, wrap_text_to_lines from adafruit_bitmap_font import bitmap_font from adafruit_azureiot import IoTCentralDevice import adafruit_bme680 -from adafruit_lc709203f import LC709203F, PackSize +import adafruit_max1704x +#from adafruit_lc709203f import LC709203F, PackSize # Get wifi details and more from a secrets.py file @@ -33,7 +35,8 @@ wifi.radio.connect(secrets["ssid"], secrets["password"]) print("Connected to WiFi!") # ntp clock - update tz_offset to your timezone -pool = socketpool.SocketPool(wifi.radio) +pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio) +ssl_context = adafruit_connection_manager.get_radio_ssl_context(wifi.radio) ntp = adafruit_ntp.NTP(pool, tz_offset=-4) rtc.RTC().datetime = ntp.datetime @@ -97,7 +100,7 @@ bme680.sea_level_pressure = 1013.25 esp = None pool = socketpool.SocketPool(wifi.radio) device = IoTCentralDevice( - pool, esp, secrets["id_scope"], secrets["device_id"], secrets["device_primary_key"] + pool, ssl_context, secrets["id_scope"], secrets["device_id"], secrets["device_primary_key"] ) print("Connecting to Azure IoT Central...") @@ -108,12 +111,13 @@ print("Connected to Azure IoT Central!") temperature_offset = -5 # Create sensor object, using the board's default I2C bus. -battery_monitor = LC709203F(i2c) +#battery_monitor = LC709203F(i2c) +battery_monitor = adafruit_max1704x.MAX17048(board.I2C()) # Update to match the mAh of your battery for more accurate readings. # Can be MAH100, MAH200, MAH400, MAH500, MAH1000, MAH2000, MAH3000. # Choose the closest match. Include "PackSize." before it, as shown. -battery_monitor.pack_size = PackSize.MAH2000 +#battery_monitor.pack_size = PackSize.MAH2000 temp = int((bme680.temperature * 9/5) + (32 + temperature_offset)) humidity = int(bme680.relative_humidity) @@ -161,20 +165,20 @@ feather_clock = 30 while True: try: - # read BME sensor + # read BME sensor temp = int((bme680.temperature * 9/5) + (32 + temperature_offset)) humidity = int(bme680.relative_humidity) pressure = int(bme680.pressure) - # log battery % + # log battery % battery = battery_monitor.cell_percent - # map range of battery charge to rectangle size on screen + # map range of battery charge to rectangle size on screen battery_display = round(simpleio.map_range(battery, 0, 100, 0, 22)) - # update rectangle to reflect battery charge + # update rectangle to reflect battery charge rect.width = int(battery_display) - # if below 20%, change rectangle color to red + # if below 20%, change rectangle color to red if battery_monitor.cell_percent < 20: rect.color_index = 1 - # when the azure clock runs out + # when the azure clock runs out if azure_clock > 500: print("getting ntp date/time") cal = ntp.datetime @@ -185,7 +189,7 @@ while True: minute = cal[4] time.sleep(2) print("getting msg") - # pack message + # pack message message = {"Temperature": temp, "Humidity": humidity, "Pressure": pressure, @@ -199,29 +203,29 @@ while True: print("updating time text") time_text.text="\n".join(wrap_text_to_lines ("Data sent on %s/%s/%s at %s" % (mon,day,year,clock_view), 20)) - # reset azure clock + # reset azure clock azure_clock = 0 - # when the feather clock runs out + # when the feather clock runs out if feather_clock > 30: print("updating screen") temp_text.text = "%0.1f° F" % temp humid_text.text = "%0.1f %%" % humidity press_text.text = "%0.2f" % pressure - # reset feather clock + # reset feather clock feather_clock = 0 - # if no clocks are running out - # increase counts by 1 + # if no clocks are running out + # increase counts by 1 else: feather_clock += 1 azure_clock += 1 - # ping azure + # ping azure device.loop() - # if something disrupts the loop, reconnect + # if something disrupts the loop, reconnect # pylint: disable=broad-except except (ValueError, RuntimeError, OSError, ConnectionError) as e: print("Network error, reconnecting\n", str(e)) supervisor.reload() continue - # delay + # delay time.sleep(1) print(azure_clock) diff --git a/Feather_RP2040_Adalogger/Arduino_RP2040_Adalogger_microSD/.feather_rp2040_adalogger.test.only b/Feather_RP2040_Adalogger/Arduino_RP2040_Adalogger_microSD/.feather_rp2040_adalogger.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Feather_RP2040_Adalogger/Arduino_RP2040_Adalogger_microSD/Arduino_RP2040_Adalogger_microSD.ino b/Feather_RP2040_Adalogger/Arduino_RP2040_Adalogger_microSD/Arduino_RP2040_Adalogger_microSD.ino new file mode 100644 index 000000000..2906dbc35 --- /dev/null +++ b/Feather_RP2040_Adalogger/Arduino_RP2040_Adalogger_microSD/Arduino_RP2040_Adalogger_microSD.ino @@ -0,0 +1,87 @@ +// SPDX-FileCopyrightText: 2023 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT +/* + SD card read/write + + This example shows how to read and write data to and from an SD card file + The circuit: + * SD card attached to SPI bus as follows: + ** MOSI - pin 11 + ** MISO - pin 12 + ** CLK - pin 13 + + created Nov 2010 + by David A. Mellis + modified 9 Apr 2012 + by Tom Igoe + modified 14 Feb 2023 + by Liz Clark + modified 25 Aug 2023 + by Kattni Rembor + + This example code is in the public domain. + + */ + +#include +#include "SdFat.h" + +#define SD_CS_PIN 23 + +SdFat SD; +FsFile myFile; +SdSpiConfig config(SD_CS_PIN, DEDICATED_SPI, SD_SCK_MHZ(16), &SPI1); + +void setup() { + // Open serial communications and wait for port to open: + Serial.begin(115200); + while (!Serial) { yield(); delay(10); } // wait till serial port is opened + delay(100); // RP2040 delay is not a bad idea + + Serial.print("Initializing SD card..."); + + // Retry mechanism for SD card initialization + while (!SD.begin(config)) { + Serial.println("initialization failed! Retrying..."); + delay(1000); // Wait for a second before retrying + } + Serial.println("initialization done."); + + // open the file. note that only one file can be open at a time, + // so you have to close this one before opening another. + myFile = SD.open("test.txt", FILE_WRITE); + + // if the file opened okay, write to it: + if (myFile) { + Serial.print("Writing to test.txt..."); + myFile.println("testing 1, 2, 3."); + myFile.println("hello world!"); + // close the file: + myFile.close(); + Serial.println("done."); + } else { + // if the file didn't open, print an error: + Serial.println("error opening test.txt"); + } + + // re-open the file for reading: + myFile = SD.open("test.txt"); + if (myFile) { + Serial.println("test.txt:"); + + // read from the file until there's nothing else in it: + while (myFile.available()) { + Serial.write(myFile.read()); + } + // close the file: + myFile.close(); + } else { + // if the file didn't open, print an error: + Serial.println("error opening test.txt"); + } +} + +void loop() { + // nothing happens after setup +} diff --git a/Feather_RP2040_Adalogger/CircuitPython_SD_Card_Read/code.py b/Feather_RP2040_Adalogger/CircuitPython_SD_Card_Read/code.py new file mode 100644 index 000000000..55eb9d944 --- /dev/null +++ b/Feather_RP2040_Adalogger/CircuitPython_SD_Card_Read/code.py @@ -0,0 +1,54 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-License-Identifier: MIT + +""" +CircuitPython Essentials SD Card Read Demo +Feather RP2040 Adalogger +""" + +import os +import busio +import digitalio +import board +import storage +import adafruit_sdcard + +# Connect to the card and mount the filesystem. +cs = digitalio.DigitalInOut(board.SD_CS) +sd_spi = busio.SPI(board.SD_CLK, board.SD_MOSI, board.SD_MISO) +sdcard = adafruit_sdcard.SDCard(sd_spi, cs) +vfs = storage.VfsFat(sdcard) +storage.mount(vfs, "/sd") + +# Use the filesystem as normal! Our files are under /sd + +# This helper function will print the contents of the SD +def print_directory(path, tabs=0): + for file in os.listdir(path): + stats = os.stat(path + "/" + file) + filesize = stats[6] + isdir = stats[0] & 0x4000 + + if filesize < 1000: + sizestr = str(filesize) + " bytes" + elif filesize < 1000000: + sizestr = "%0.1f KB" % (filesize / 1000) + else: + sizestr = "%0.1f MB" % (filesize / 1000000) + + prettyprintname = "" + for _ in range(tabs): + prettyprintname += " " + prettyprintname += file + if isdir: + prettyprintname += "/" + print("{0:<40} Size: {1:>10}".format(prettyprintname, sizestr)) + + # recursively print directory contents + if isdir: + print_directory(path + "/" + file, tabs + 1) + + +print("Files on filesystem:") +print("====================") +print_directory("/sd") diff --git a/Feather_RP2040_Adalogger/CircuitPython_SD_Card_Write/code.py b/Feather_RP2040_Adalogger/CircuitPython_SD_Card_Write/code.py new file mode 100644 index 000000000..4dd6fc8a6 --- /dev/null +++ b/Feather_RP2040_Adalogger/CircuitPython_SD_Card_Write/code.py @@ -0,0 +1,36 @@ +# SPDX-FileCopyrightText: 2017 Limor Fried for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +""" +CircuitPython Essentials SD Card Write Demo +Feather RP2040 Adalogger +""" + +import time +import busio +import board +import digitalio +import microcontroller +import storage +import adafruit_sdcard + +# Connect to the card and mount the filesystem. +cs = digitalio.DigitalInOut(board.SD_CS) +sd_spi = busio.SPI(board.SD_CLK, board.SD_MOSI, board.SD_MISO) +sdcard = adafruit_sdcard.SDCard(sd_spi, cs) +vfs = storage.VfsFat(sdcard) +storage.mount(vfs, "/sd") + +# Use the filesystem as normal! Our files are under /sd + +print("Logging temperature to filesystem") +# append to the file! +while True: + # open file for append + with open("/sd/temperature.txt", "a") as f: + t = microcontroller.cpu.temperature + print("Temperature = %0.1f" % t) + f.write("%0.1f\n" % t) + # file is saved + time.sleep(1) diff --git a/Feather_RP2350_Examples/CircuitPython_Digital_Input/code.py b/Feather_RP2350_Examples/CircuitPython_Digital_Input/code.py new file mode 100644 index 000000000..d51f7cd94 --- /dev/null +++ b/Feather_RP2350_Examples/CircuitPython_Digital_Input/code.py @@ -0,0 +1,19 @@ +# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython Digital Input Example - Blinking an LED using a button switch. +""" +import board +import digitalio + +led = digitalio.DigitalInOut(board.LED) +led.direction = digitalio.Direction.OUTPUT + +button = digitalio.DigitalInOut(board.D5) +button.switch_to_input(pull=digitalio.Pull.UP) + +while True: + if not button.value: + led.value = True + else: + led.value = False diff --git a/Feather_RP2350_Examples/CircuitPython_I2S_Tone/code.py b/Feather_RP2350_Examples/CircuitPython_I2S_Tone/code.py new file mode 100644 index 000000000..2651b0644 --- /dev/null +++ b/Feather_RP2350_Examples/CircuitPython_I2S_Tone/code.py @@ -0,0 +1,29 @@ +# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython I2S Tone playback example. +Plays a tone for one second on, one +second off, in a loop. +""" +import time +import array +import math +import audiocore +import board +import audiobusio + +audio = audiobusio.I2SOut(board.D6, board.D5, board.D9) + +tone_volume = 0.1 # Increase this to increase the volume of the tone. +frequency = 440 # Set this to the Hz of the tone you want to generate. +length = 8000 // frequency +sine_wave = array.array("h", [0] * length) +for i in range(length): + sine_wave[i] = int((math.sin(math.pi * 2 * i / length)) * tone_volume * (2 ** 15 - 1)) +sine_wave_sample = audiocore.RawSample(sine_wave) + +while True: + audio.play(sine_wave_sample, loop=True) + time.sleep(1) + audio.stop() + time.sleep(1) diff --git a/Feather_RP2350_Examples/CircuitPython_I2S_Wav/StreetChicken.wav b/Feather_RP2350_Examples/CircuitPython_I2S_Wav/StreetChicken.wav new file mode 100644 index 000000000..55d4eb0f2 Binary files /dev/null and b/Feather_RP2350_Examples/CircuitPython_I2S_Wav/StreetChicken.wav differ diff --git a/Feather_RP2350_Examples/CircuitPython_I2S_Wav/code.py b/Feather_RP2350_Examples/CircuitPython_I2S_Wav/code.py new file mode 100644 index 000000000..c7f0b55a9 --- /dev/null +++ b/Feather_RP2350_Examples/CircuitPython_I2S_Wav/code.py @@ -0,0 +1,21 @@ +# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython I2S WAV file playback. +Plays a WAV file once. +""" +import audiocore +import board +import audiobusio + +audio = audiobusio.I2SOut(board.D6, board.D5, board.D9) + +with open("StreetChicken.wav", "rb") as wave_file: + wav = audiocore.WaveFile(wave_file) + + print("Playing wav file!") + audio.play(wav) + while audio.playing: + pass + +print("Done!") diff --git a/Feather_RP2350_Examples/CircuitPython_PSRAM/code.py b/Feather_RP2350_Examples/CircuitPython_PSRAM/code.py new file mode 100644 index 000000000..50f7b2e09 --- /dev/null +++ b/Feather_RP2350_Examples/CircuitPython_PSRAM/code.py @@ -0,0 +1,5 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# SPDX-License-Identifier: MIT +import gc + +print(gc.mem_free()) diff --git a/Feather_RP2350_Examples/CircuitPython_PWM_mp3/code.py b/Feather_RP2350_Examples/CircuitPython_PWM_mp3/code.py new file mode 100644 index 000000000..db70b9a6c --- /dev/null +++ b/Feather_RP2350_Examples/CircuitPython_PWM_mp3/code.py @@ -0,0 +1,20 @@ +# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython single MP3 playback example. +Plays a single MP3 once. +""" +import board +import audiomp3 +import audiopwmio + +audio = audiopwmio.PWMAudioOut(board.A0) + +with open("slow.mp3", "rb") as mp3_file: + decoder = audiomp3.MP3Decoder(mp3_file) + + audio.play(decoder) + while audio.playing: + pass + +print("Done playing!") diff --git a/Feather_RP2350_Examples/CircuitPython_PWM_mp3/slow.mp3 b/Feather_RP2350_Examples/CircuitPython_PWM_mp3/slow.mp3 new file mode 100644 index 000000000..39ceecdf6 Binary files /dev/null and b/Feather_RP2350_Examples/CircuitPython_PWM_mp3/slow.mp3 differ diff --git a/Feather_RP2350_Examples/CircuitPython_PWM_multiMP3/code.py b/Feather_RP2350_Examples/CircuitPython_PWM_multiMP3/code.py new file mode 100644 index 000000000..fc60fbc45 --- /dev/null +++ b/Feather_RP2350_Examples/CircuitPython_PWM_multiMP3/code.py @@ -0,0 +1,26 @@ +# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries +# SPDX-License-Identifier: MIT +""" +CircuitPython multiple MP3 playback example. +Plays two MP3 files consecutively, once time each. +""" + +import board +import audiomp3 +import audiopwmio + +audio = audiopwmio.PWMAudioOut(board.A0) + +mp3files = ["slow.mp3", "happy.mp3"] + +with open(mp3files[0], "rb") as mp3: + decoder = audiomp3.MP3Decoder(mp3) + + for filename in mp3files: + with open(filename, "rb") as decoder.file: + audio.play(decoder) + print("Playing:", filename) + while audio.playing: + pass + +print("Done playing!") diff --git a/Feather_RP2350_Examples/CircuitPython_PWM_multiMP3/happy.mp3 b/Feather_RP2350_Examples/CircuitPython_PWM_multiMP3/happy.mp3 new file mode 100644 index 000000000..58fd59724 Binary files /dev/null and b/Feather_RP2350_Examples/CircuitPython_PWM_multiMP3/happy.mp3 differ diff --git a/Feather_RP2350_Examples/CircuitPython_PWM_multiMP3/slow.mp3 b/Feather_RP2350_Examples/CircuitPython_PWM_multiMP3/slow.mp3 new file mode 100644 index 000000000..39ceecdf6 Binary files /dev/null and b/Feather_RP2350_Examples/CircuitPython_PWM_multiMP3/slow.mp3 differ diff --git a/Feather_TFT_Blinka_Says/code.py b/Feather_TFT_Blinka_Says/code.py new file mode 100644 index 000000000..9fb6cff3c --- /dev/null +++ b/Feather_TFT_Blinka_Says/code.py @@ -0,0 +1,368 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +Blinka Says - A game inspired by Simon. Test your memory by +following along to the pattern that Blinka puts forth. + +This project uses asyncio for cooperative multitasking +through tasks. There is one task for the players actions +and another for Blinka's actions. + +The player action reads input from the buttons being +pressed by the player and reacts to them as appropriate. + +The Blinka action blinks the randomized sequence that +the player must then try to follow and replicate. +""" +import random +import time + +import asyncio +import board +from digitalio import DigitalInOut, Direction +from displayio import Group +import keypad +import terminalio + +from adafruit_display_text.bitmap_label import Label +import foamyguy_nvm_helper as nvm_helper + +# State Machine variables +STATE_WAITING_TO_START = 0 +STATE_PLAYER_TURN = 1 +STATE_BLINKA_TURN = 2 + +# list of color shortcut letters +COLORS = ("Y", "G", "R", "B") + +# keypad initialization to read the button pins +buttons = keypad.Keys( + (board.D5, board.D6, board.D9, board.D10), value_when_pressed=False, pull=True) + +# Init LED output pins +leds = { + "Y": DigitalInOut(board.A0), + "G": DigitalInOut(board.A1), + "R": DigitalInOut(board.A3), + "B": DigitalInOut(board.A2) +} + +for color in COLORS: + leds[color].direction = Direction.OUTPUT + +# display setup +display = board.DISPLAY +main_group = Group() + +# Label to show the "High" score label +highscore_lbl = Label(terminalio.FONT, text="High ", scale=2) +highscore_lbl.anchor_point = (1.0, 0.0) +highscore_lbl.anchored_position = (display.width - 4, 4) +main_group.append(highscore_lbl) + +# Label to show the "Current" score label +curscore_lbl = Label(terminalio.FONT, text="Current", scale=2) +curscore_lbl.anchor_point = (0.0, 0.0) +curscore_lbl.anchored_position = (4, 4) +main_group.append(curscore_lbl) + +# Label to show the current score numerical value +curscore_val = Label(terminalio.FONT, text="0", scale=4) +curscore_val.anchor_point = (0.0, 0.0) +curscore_val.anchored_position = (4, + curscore_lbl.bounding_box[1] + + (curscore_lbl.bounding_box[3] * curscore_lbl.scale) + + 10) +main_group.append(curscore_val) + +# Label to show the high score numerical value +highscore_val = Label(terminalio.FONT, text="0", scale=4) +highscore_val.anchor_point = (1.0, 0.0) +highscore_val.anchored_position = (display.width - 4, + highscore_lbl.bounding_box[1] + + highscore_lbl.bounding_box[3] * curscore_lbl.scale + + 10) +main_group.append(highscore_val) + +# Label to show the "Game Over" message. +game_over_lbl = Label(terminalio.FONT, text="Game Over", scale=3) +game_over_lbl.anchor_point = (0.5, 1.0) +game_over_lbl.anchored_position = (display.width // 2, display.height - 4) +game_over_lbl.hidden = True +main_group.append(game_over_lbl) + +# set the main_group to show on the display +display.root_group = main_group + + +class GameState: + """ + Class that stores all the information about the game state. + Used for keeping track of everything and sharing it between + the asyncio tasks. + """ + def __init__(self, difficulty: int, led_off_time: int, led_on_time: int): + # how many blinks per sequence + self.difficulty = difficulty + + # how long the LED should spend off during a blink + self.led_off_time = led_off_time + + # how long the LED should spend on during a blink + self.led_on_time = led_on_time + + # the player's current score + self.score = 0 + + # the current state for the state machine that controls how the game behaves. + self.current_state = STATE_WAITING_TO_START + + # list to hold the sequence of colors that have been chosen + self.sequence = [] + + # the current index within the sequence + self.index = 0 + + # a timestamp that will be used to ignore button presses for a short period of time + # to avoid accidental double presses. + self.btn_cooldown_time = -1 + + # a variable to hold the eventual high-score + self.highscore = None + + try: + # read data from NVM storage + read_data = nvm_helper.read_data() + # if we found data check if it's a high-score value + if isinstance(read_data, list) and read_data[0] == "bls_hs": + # it is a high-score so populate the label with its value + self.highscore = read_data[1] + except EOFError: + # no high-score data + pass + + +async def player_action(game_state: GameState): + """ + Read the buttons to determine if the player has pressed any of them, and react + appropriately if so. + + :param game_state: The GameState object that holds the current state of the game. + :return: None + """ + # pylint: disable=too-many-branches, too-many-statements + + # loop forever inside of this task + while True: + # get any events that have occurred from the keypad object + key_event = buttons.events.get() + + # if we're Waiting To Start + if game_state.current_state == STATE_WAITING_TO_START: + + # if the buttons aren't locked out for cool down + if game_state.btn_cooldown_time < time.monotonic(): + + # if there is a released event on any key + if key_event and key_event.released: + + # hide the game over label + game_over_lbl.hidden = True + + # show the starting score + curscore_val.text = str(game_state.score) + print("Starting game!") + # ready set go blinks + for _, led_obj in leds.items(): + led_obj.value = True + await asyncio.sleep(250 / 1000) + for _, led_obj in leds.items(): + led_obj.value = False + await asyncio.sleep(250 / 1000) + for _, led_obj in leds.items(): + led_obj.value = True + await asyncio.sleep(250 / 1000) + for _, led_obj in leds.items(): + led_obj.value = False + await asyncio.sleep(250 / 1000) + for _, led_obj in leds.items(): + led_obj.value = True + await asyncio.sleep(250 / 1000) + for _, led_obj in leds.items(): + led_obj.value = False + + # change the state to Blinka's Turn + game_state.current_state = STATE_BLINKA_TURN + + # if it's Blinka's Turn + elif game_state.current_state == STATE_BLINKA_TURN: + # ignore buttons on Blinka's turn + pass + + # if it's the Player's Turn + elif game_state.current_state == STATE_PLAYER_TURN: + + # if a button has been pressed + if key_event and key_event.pressed: + # light up the corresponding LED in the button + leds[COLORS[key_event.key_number]].value = True + + # if a button has been released + if key_event and key_event.released: + # turn off the corresponding LED in the button + leds[COLORS[key_event.key_number]].value = False + #print(key_event) + #print(game_state.sequence) + + # if the color of the button pressed matches the current color in the sequence + if COLORS[key_event.key_number] == game_state.sequence[0]: + + # remove the current color from the sequence + game_state.sequence.pop(0) + + # increment the score value + game_state.score += 1 + + # update the score label + curscore_val.text = str(game_state.score) + + # if there are no colors left in the sequence + # i.e. the level is complete + if len(game_state.sequence) == 0: + + # give a bonus point for finishing the level + game_state.score += 1 + + # increase the difficulty for next level + game_state.difficulty += 1 + + # update the score label + curscore_val.text = str(game_state.score) + + # change the state to Blinka's Turn + game_state.current_state = STATE_BLINKA_TURN + print(f"difficulty after lvl: {game_state.difficulty}") + + # The pressed button color does not match the current color in the sequence + # i.e. player pressed the wrong button + else: + print("player lost!") + # show the game over label + game_over_lbl.hidden = False + + # if the player's current score is higher than the highscore + if game_state.highscore is None or game_state.score > game_state.highscore: + + # save new high score value to NVM storage + nvm_helper.save_data(("bls_hs", game_state.score), test_run=False) + + # update highscore variable to the players score + game_state.highscore = game_state.score + + # update the high score label + highscore_val.text = str(game_state.score) + + # change to Waiting to Start + game_state.current_state = STATE_WAITING_TO_START + + # reset the current score to zero + game_state.score = 0 + + # reset the difficulty to 1 + game_state.difficulty = 1 + + # enable the button cooldown timer to ignore any button presses + # in the near future to avoid double presses + game_state.btn_cooldown_time = time.monotonic() + 1.5 + + # reset the sequence to an empty list + game_state.sequence = [] + + # sleep, allowing other asyncio tasks to take action + await asyncio.sleep(0) + + +async def blinka_action(game_state: GameState): + """ + Choose colors randomly to add to the sequence. Blink the LEDs in accordance + with the sequence. + + :param game_state: The GameState object that holds the current state of the game. + :return: None + """ + + # loop forever inside of this task + while True: + # if it's Blinka's Turn + if game_state.current_state == STATE_BLINKA_TURN: + print(f"difficulty start of blinka turn: {game_state.difficulty}") + + # if the sequence is empty + if len(game_state.sequence) == 0: + + # loop for the current difficulty + for _ in range(game_state.difficulty): + # append a random color to the sequence + game_state.sequence.append(random.choice(COLORS)) + print(game_state.sequence) + + # wait for LED_OFF amount of time + await asyncio.sleep(game_state.led_off_time / 1000) + + # turn on the LED for the current color in the sequence + leds[game_state.sequence[game_state.index]].value = True + + # wait for LED_ON amount of time + await asyncio.sleep(game_state.led_on_time / 1000) + + # turn off the LED for the current color in the sequence + leds[game_state.sequence[game_state.index]].value = False + + # wait for LED_OFF amount of time + await asyncio.sleep(game_state.led_off_time / 1000) + + # increment the index + game_state.index += 1 + + # if the last index in the sequence has been passed + if game_state.index >= len(game_state.sequence): + + # reset the index to zero + game_state.index = 0 + + # change to the Players Turn + game_state.current_state = STATE_PLAYER_TURN + print("players turn!") + + # sleep, allowing other asyncio tasks to take action + await asyncio.sleep(0) + + +async def main(): + """ + Main asyncio task that will initialize the Game State and + start the other tasks running. + + :return: None + """ + + # initialize the Game State + game_state = GameState(1, 500, 500) + + # if there is a saved highscore + if game_state.highscore is not None: + # set the highscore into it's label to show on the display + highscore_val.text = str(game_state.highscore) + + # initialze player task + player_task = asyncio.create_task(player_action(game_state)) + + # initialize blinka task + blinka_task = asyncio.create_task(blinka_action(game_state)) + + # start the tasks running + await asyncio.gather(player_task, blinka_task) + +# run the main task +asyncio.run(main()) diff --git a/Feather_ePaper_Quotes/adafruit_feather_quote/adafruit_feather_quote.ino b/Feather_ePaper_Quotes/adafruit_feather_quote/adafruit_feather_quote.ino index 46b72a7b6..f3f23839d 100644 --- a/Feather_ePaper_Quotes/adafruit_feather_quote/adafruit_feather_quote.ino +++ b/Feather_ePaper_Quotes/adafruit_feather_quote/adafruit_feather_quote.ino @@ -21,6 +21,7 @@ #include // Core graphics library #include +#include #include //https://github.com/bblanchon/ArduinoJson #include #include "secrets.h" @@ -212,7 +213,7 @@ String getURLResponse(String url) void getQuote(String "e, String &author) { - StaticJsonDocument<1024> doc; + DynamicJsonDocument doc(1024); String url = "https://www.adafruit.com/api/quotes.php"; String jsonquote = getURLResponse(url); if(jsonquote.length() > 0) diff --git a/FunHouse_Fume_Extractor/code.py b/FunHouse_Fume_Extractor/code.py index f5403de7d..e05999784 100644 --- a/FunHouse_Fume_Extractor/code.py +++ b/FunHouse_Fume_Extractor/code.py @@ -74,7 +74,7 @@ fan_text = funhouse.add_text( text_font="fonts/Arial-Bold-24.pcf", ) # showing graphics -funhouse.display.show(funhouse.splash) +funhouse.display.root_group = funhouse.splash # state machines run = False # state if main code is running diff --git a/GC9A01A_Demo_Code/Arduino_GC9A01A/.uno.test.only b/GC9A01A_Demo_Code/Arduino_GC9A01A/.uno.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/GC9A01A_Demo_Code/Arduino_GC9A01A/Arduino_GC9A01A.ino b/GC9A01A_Demo_Code/Arduino_GC9A01A/Arduino_GC9A01A.ino new file mode 100644 index 000000000..bf6141b66 --- /dev/null +++ b/GC9A01A_Demo_Code/Arduino_GC9A01A/Arduino_GC9A01A.ino @@ -0,0 +1,622 @@ +// SPDX-FileCopyrightText: 2022 Phillip Burgess for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Graphics example for EYESPI-capable color displays. This code: +// - Functions as a "Hello World" to verify that microcontroller and screen +// are communicating. +// - Demonstrates most of the drawing commands of the Adafruit_GFX library. +// - Showcases some techniques that might not be obvious or that aren't +// built-in but can be handled with a little extra code. +// It DOES NOT: +// - Support all Adafruit screens, ONLY EYESPI products at the time this was +// written! But it's easily adapted by looking at other examples. +// - Demonstrate the Adafruit_GFX_Button class, as that's unique to +// touch-capable displays. Again, other examples may cover this topic. +// This sketch is long, but a lot of it is comments to explain each step. You +// can copy just the parts you need as a starting point for your own projects, +// and strip comments once understood. + +// CONSTANTS, HEADERS and GLOBAL VARIABLES --------------------------------- + +// *** EDIT THIS VALUE TO MATCH THE ADAFRUIT PRODUCT ID FOR YOUR DISPLAY: *** +#define SCREEN_PRODUCT_ID 6178 // GC9A01A 240x240 round display +// You can find the product ID several ways: +// - "PID" accompanies each line-item on your receipt or order details page. +// - Visit adafruit.com and search for EYESPI displays. On product pages, +// PID is shown just below product title, and is at the end of URLs. +// - Check the comments in setup() later that reference various screens. + +// **** EDIT PINS TO MATCH YOUR WIRING **** +#define TFT_CS 10 // To display chip-select pin +#define TFT_RST 9 // To display reset pin +#define TFT_DC 8 // To display data/command pin +// For the remaining pins, this code assumes display is wired to hardware SPI +// on the dev board's primary SPI interface. The display libraries can support +// secondary SPI (if present) or bitbang (software) SPI, but that's not +// demonstrated here. See other examples for more varied interfacing options. +#include +#include // Core graphics library +#include // A custom font +#if (SCREEN_PRODUCT_ID == 1480) || (SCREEN_PRODUCT_ID == 2090) +#include // Library for ILI9341-based screens +Adafruit_ILI9341 display(TFT_CS, TFT_DC, TFT_RST); +#elif (SCREEN_PRODUCT_ID == 6178) +#include "Adafruit_GC9A01A.h" +Adafruit_GC9A01A display(TFT_CS, TFT_DC, TFT_RST); +#else +#include // Library for ST7789-based screens +Adafruit_ST7789 display(TFT_CS, TFT_DC, TFT_RST); +#endif + +#define PAUSE 3000 // Delay (millisecondss) between examples +uint8_t rotate = 0; // Current screen orientation (0-3) + +// setup() RUNS ONCE AT PROGRAM STARTUP ------------------------------------ + +void setup() { + // Initialize display hardware +#if (SCREEN_PRODUCT_ID == 5393) // 1.47" 320x172 round-rect TFT +#define CORNER_RADIUS 22 + display.init(172, 320); +#elif (SCREEN_PRODUCT_ID == 3787) // 240x240 TFT + display.init(240, 240); +#elif (SCREEN_PRODUCT_ID == 5206) // 1.69" 280x240 round-rect TFT +#define CORNER_RADIUS 43 + display.init(240, 280); +#elif (SCREEN_PRODUCT_ID == 5394) // 1.9" 320x170 TFT + display.init(170, 320); +#elif (SCREEN_PRODUCT_ID == 6113) + display.init(135, 240); +#else +#define CORNER_RADIUS 45// All ILI9341 & GC9A01A TFTs (320x240)/(240x240) + display.begin(); +#endif +#if !defined(CORNER_RADIUS) +#define CORNER_RADIUS 0 +#endif + + // OPTIONAL: default TFT SPI speed is fairly conservative, you can try + // overriding here for faster screen updates. Actual SPI speed may be less + // depending on microcontroller's capabilities. Max reliable speed also + // depends on wiring length and tidyness. + //display.setSPISpeed(40000000); +} + +// MAIN LOOP, REPEATS FOREVER ---------------------------------------------- + +void loop() { + // Each of these functions demonstrates a different Adafruit_GFX concept: + show_shapes(); + show_charts(); + show_basic_text(); + show_char_map(); + show_custom_text(); + show_bitmap(); +#if !defined(AVR) + // The full set of examples (plus the custom font) won't fit on an 8-bit + // Arduino, something's got to go. You can try out this one IF the other + // examples are disabled instead. + show_canvas(); +#endif + + if (++rotate > 3) rotate = 0; // Cycle through screen rotations 0-3 + display.setRotation(rotate); // Takes effect on next drawing command +} + +// BASIC SHAPES EXAMPLE ---------------------------------------------------- + +void show_shapes() { + const int16_t cx = display.width() / 2; // Center of screen = + const int16_t cy = display.height() / 2; // half of width, height + int16_t minor = min(cx, cy); // Lesser of half width or height + // Shapes will be drawn in a square region centered on the screen. But one + // particular screen -- rounded 240x280 ST7789 -- has VERY rounded corners + // that would clip a couple of shapes if drawn full size. If using that + // screen type, reduce area by a few pixels to avoid drawing in corners. + const uint8_t pad = 5; // Space between shapes is 2X this + const int16_t size = minor - pad; // Shapes are this width & height + const int16_t half = size / 2; // 1/2 of shape size + + // Rectangle + display.fillScreen(0); + display.drawRect(cx - half, cy - half, size, size, 0xF800); + delay(500); + + display.fillScreen(0); + display.fillRect(cx - half, cy - half, size, size, 0xF800); + delay(500); + + // Triangle + display.fillScreen(0); + display.drawTriangle( + cx, cy - half, // Top + cx - half, cy + half, // Bottom left + cx + half, cy + half, // Bottom right + 0x07E0 + ); + delay(500); + + display.fillScreen(0); + display.fillTriangle( + cx, cy - half, // Top + cx - half, cy + half, // Bottom left + cx + half, cy + half, // Bottom right + 0x07E0 + ); + delay(500); + + // Circle + display.fillScreen(0); + display.drawCircle(cx, cy, half, 0x001F); + delay(500); + + display.fillScreen(0); + display.fillCircle(cx, cy, half, 0x001F); + delay(500); + + // Rounded Rectangle + display.fillScreen(0); + display.drawRoundRect(cx - half, cy - half, size, size, size/5, 0xFFE0); + delay(500); + + display.fillScreen(0); + display.fillRoundRect(cx - half, cy - half, size, size, size/5, 0xFFE0); + delay(500); +} + +// CHART EXAMPLES ---------------------------------------------------------- + +void show_charts() { + // Draw some graphs and charts. GFX library doesn't handle these as native + // object types, but it only takes a little code to build them from simple + // shapes. This demonstrates: + // - Drawing points and horizontal, vertical and arbitrary lines. + // - Adapting to different-sized displays. + // - Graphics being clipped off edge. + // - Use of negative values to draw shapes "backward" from an anchor point. + // - C technique for finding array size at runtime (vs hardcoding). + + display.fillScreen(0); // Clear screen + + const int16_t cx = display.width() / 2; // Center of screen = + const int16_t cy = display.height() / 2; // half of width, height + const int16_t minor = min(cx, cy); // Lesser of half width or height + const int16_t major = max(cx, cy); // Greater of half width or height + + // Let's start with a relatively simple sine wave graph with axes. + // Draw graph axes centered on screen. drawFastHLine() and drawFastVLine() + // need fewer arguments than normal 2-point line drawing shown later. + display.drawFastHLine(0, cy, display.width(), 0x0210); // Dark blue + display.drawFastVLine(cx, 0, display.height(), 0x0210); + + // Then draw some tick marks along the axes. To keep this code simple, + // these aren't to any particular scale, but a real program may want that. + // The loop here draws them from the center outward and pays no mind + // whether the screen is rectangular; any ticks that go off-screen will + // be clipped by the library. + for (uint8_t i=1; i<=10; i++) { + // The Arduino map() function scales an input value (e.g. "i") from an + // input range (0-10 here) to an output range (0 to major-1 here). + // Very handy for making graphics adjust to different screens! + int16_t n = map(i, 0, 10, 0, major - 1); // Tick offset relative to center point + display.drawFastVLine(cx - n, cy - 5, 11, 0x210); + display.drawFastVLine(cx + n, cy - 5, 11, 0x210); + display.drawFastHLine(cx - 5, cy - n, 11, 0x210); + display.drawFastHLine(cx - 5, cy + n, 11, 0x210); + } + + // Then draw sine wave over this using GFX drawPixel() function. + for (int16_t x=0; x(str.c_str())); +} + +// TEXT EXAMPLES ----------------------------------------------------------- + +// This section demonstrates: +// - Using the default 5x7 built-in font, including scaling in each axis. +// - How to access all characters of this font, including symbols. +// - Using a custom font, including alignment techniques that aren't a normal +// part of the GFX library (uses functions above). + +void show_basic_text() { + // Show text scaling with built-in font. + display.fillScreen(0); + display.setFont(); // Use default font + display.setCursor(50, CORNER_RADIUS); // Initial cursor position + display.setTextSize(1); // Default size + display.println(F("Standard built-in font")); + display.setTextSize(2); + display.setCursor(30, display.getCursorY()); + display.println(F("BIG TEXT")); + display.setTextSize(3); + // "BIGGER TEXT" won't fit on narrow screens, so abbreviate there. + display.setCursor(20, display.getCursorY()); + display.println((display.width() >= 200) ? F("BIGGER TEXT") : F("BIGGER")); + display.setTextSize(2, 4); + display.setCursor(15, display.getCursorY()); + display.println(F("TALL and")); + display.setCursor(15, display.getCursorY()); + display.setTextSize(4, 2); + display.println(F("WIDE")); + + delay(PAUSE); +} // END BASIC TEXT EXAMPLE + +void show_char_map() { + // "Code Page 437" is a name given to the original IBM PC character set. + // Despite age and limited language support, still seen in small embedded + // settings as it has some useful symbols and accented characters. The + // default 5x7 pixel font of Adafruit_GFX is modeled after CP437. This + // function draws a table of all the characters & explains some issues. + + // There are 256 characters in all. Draw table as 16 rows of 16 columns, + // plus hexadecimal row & column labels. How big can each cell be drawn? + const int cell_size = min(display.width(), display.height()) / 17; + if (cell_size < 8) return; // Screen is too small for table, skip example. + const int total_size = cell_size * 17; // 16 cells + 1 row or column label + + // Set up for default 5x7 font at 1:1 scale. Custom fonts are NOT used + // here as most are only 128 characters to save space (the "7b" at the + // end of many GFX font names means "7 bits," i.e. 128 characters). + display.setFont(); + display.setTextSize(1); + + // Early Adafruit_GFX was missing one symbol, throwing off some indices! + // But fixing the library would break MANY existing sketches that relied + // on the degrees symbol and others. The default behavior is thus "broken" + // to keep older code working. New code can access the CORRECT full CP437 + // table by calling this function like so: + display.cp437(true); + + display.fillScreen(0); + + const int16_t x = (display.width() - total_size) / 2; // Upper left corner of + int16_t y = (display.height() - total_size) / 2; // table centered on screen + if (y >= 4) { // If there's a little extra space above & below, scoot table + y += 4; // down a few pixels and show a message centered at top. + display.setCursor((display.width() - 114) / 2, 0); // 114 = pixel width + display.print(F("CP437 Character Map")); // of this message + } + + const int16_t inset_x = (cell_size - 5) / 2; // To center each character within cell, + const int16_t inset_y = (cell_size - 8) / 2; // compute X & Y offset from corner. + + for (uint8_t row=0; row<16; row++) { // 16 down... + // Draw row and columm headings as hexadecimal single digits. To get the + // hex value for a specific character, combine the left & top labels, + // e.g. Pi symbol is row E, column 3, thus: display.print((char)0xE3); + display.setCursor(x + (row + 1) * cell_size + inset_x, y + inset_y); + display.print(row, HEX); // This actually draws column labels + display.setCursor(x + inset_x, y + (row + 1) * cell_size + inset_y); + display.print(row, HEX); // and THIS is the row labels + for (uint8_t col=0; col<16; col++) { // 16 across... + if ((row + col) & 1) { // Fill alternating cells w/gray + display.fillRect(x + (col + 1) * cell_size, y + (row + 1) * cell_size, + cell_size, cell_size, 0x630C); + } + // drawChar() bypasses usual cursor positioning to go direct to an X/Y + // location. If foreground & background match, it's drawn transparent. + display.drawChar(x + (col + 1) * cell_size + inset_x, + y + (row + 1) * cell_size + inset_y, row * 16 + col, + 0xFFFF, 0xFFFF, 1); + } + } + + delay(PAUSE * 2); +} // END CHAR MAP EXAMPLE + +void show_custom_text() { + // Show use of custom fonts, plus how to do center or right alignment + // using some additional functions provided earlier. + + display.fillScreen(0); + display.setFont(&FreeSansBold18pt7b); + display.setTextSize(1); + display.setTextWrap(false); // Allow text off edges + + // Get "M height" of custom font and move initial base line there: + uint16_t w, h; + int16_t x, y; + display.getTextBounds("M", 0, 0, &x, &y, &w, &h); + // On rounded 240x280 display in tall orientation, "Custom Font" gets + // clipped by top corners. Scoot text down a few pixels in that one case. + if ((CORNER_RADIUS && (display.height() == 280)) || (SCREEN_PRODUCT_ID == 6178)) h += 20; + display.setCursor(display.width() / 2, h); + + if ((display.width() >= 200) && (SCREEN_PRODUCT_ID != 6178)) { + print_aligned(display, F("Custom Font"), GFX_ALIGN_CENTER); + display.setCursor(0, display.getCursorY() + 10); + print_aligned(display, F("Align Left"), GFX_ALIGN_LEFT); + display.setCursor(display.width() / 2, display.getCursorY()); + print_aligned(display, F("Centered"), GFX_ALIGN_CENTER); + // Small rounded screen, when oriented the wide way, "Right" gets + // clipped by bottom right corner. Scoot left to compensate. + int16_t x_offset = (CORNER_RADIUS && (display.height() < 200)) ? 15 : 0; + display.setCursor(display.width() - x_offset, display.getCursorY()); + print_aligned(display, F("Align Right"), GFX_ALIGN_RIGHT); + } else { + display.setCursor(display.width() / 2, display.height() / 2); + print_aligned(display, F("Custom Font"), GFX_ALIGN_CENTER); + + } + + delay(PAUSE); +} // END CUSTOM FONT EXAMPLE + +// BITMAP EXAMPLE ---------------------------------------------------------- + +// This section demonstrates: +// - Embedding a small bitmap in the code (flash memory). +// - Drawing that bitmap in various colors, and transparently (only '1' bits +// are drawn; '0' bits are skipped, leaving screen contents in place). +// - Use of the color565() function to decimate 24-bit RGB to 16 bits. + +#define HEX_WIDTH 16 // Bitmap width in pixels +#define HEX_HEIGHT 16 // Bitmap height in pixels +// Bitmap data. PROGMEM ensures it's in flash memory (not RAM). And while +// it would be valid to leave the brackets empty here (i.e. hex_bitmap[]), +// having dimensions with a little math makes the compiler verify the +// correct number of bytes are present in the list. +PROGMEM const uint8_t hex_bitmap[(HEX_WIDTH + 7) / 8 * HEX_HEIGHT] = { + 0b00000001, 0b10000000, + 0b00000111, 0b11100000, + 0b00011111, 0b11111000, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b00011111, 0b11111000, + 0b00000111, 0b11100000, + 0b00000001, 0b10000000, +}; +#define Y_SPACING (HEX_HEIGHT - 2) // Used by code below for positioning + +void show_bitmap() { + display.fillScreen(0); + + // Not screen center, but UL coordinates of center hexagon bitmap + const int16_t center_x = (display.width() - HEX_WIDTH) / 2; + const int16_t center_y = (display.height() - HEX_HEIGHT) / 2; + const uint8_t steps = min((display.height() - HEX_HEIGHT) / Y_SPACING, + display.width() / HEX_WIDTH - 1) / 2; + + display.drawBitmap(center_x, center_y, hex_bitmap, HEX_WIDTH, HEX_HEIGHT, + 0xFFFF); // Draw center hexagon in white + + // Tile the hexagon bitmap repeatedly in a range of hues. Don't mind the + // bit of repetition in the math, the optimizer easily picks this up. + // Also, if math looks odd, keep in mind "PEMDAS" operator precedence; + // multiplication and division occur before addition and subtraction. + for (uint8_t a=0; a<=steps; a++) { + for (uint8_t b=1; b<=steps; b++) { + display.drawBitmap( // Right section centered red: a = green, b = blue + center_x + (a + b) * HEX_WIDTH / 2, + center_y + (a - b) * Y_SPACING, + hex_bitmap, HEX_WIDTH, HEX_HEIGHT, + display.color565(255, 255 - 255 * a / steps, 255 - 255 * b / steps)); + display.drawBitmap( // UL section centered green: a = blue, b = red + center_x - b * HEX_WIDTH + a * HEX_WIDTH / 2, + center_y - a * Y_SPACING, + hex_bitmap, HEX_WIDTH, HEX_HEIGHT, + display.color565(255 - 255 * b / steps, 255, 255 - 255 * a / steps)); + display.drawBitmap( // LL section centered blue: a = red, b = green + center_x - a * HEX_WIDTH + b * HEX_WIDTH / 2, + center_y + b * Y_SPACING, + hex_bitmap, HEX_WIDTH, HEX_HEIGHT, + display.color565(255 - 255 * a / steps, 255 - 255 * b / steps, 255)); + } + } + + delay(PAUSE); +} // END BITMAP EXAMPLE + +// CANVAS EXAMPLE ---------------------------------------------------------- + +// This section demonstrates: +// - How to refresh changing values onscreen without erase/redraw flicker. +// - Using an offscreen canvas. It's similar to a bitmap above, but rather +// than a fixed pattern in flash memory, it's drawable like the screen. +// - More tips on text alignment, and adapting to different screen sizes. + +#define PADDING 6 // Pixels between axis label and value + +void show_canvas() { + // For this example, let's suppose we want to display live readings from a + // sensor such as a three-axis accelerometer, something like: + // X: (number) + // Y: (number) + // Z: (number) + // To look extra classy, we want a custom font, and the labels for each + // axis are right-aligned so the ':' characters line up... + + display.setFont(&FreeSansBold18pt7b); // Use a custom font + display.setTextSize(1); // and reset to 1:1 scale + + const char *label[] = { "X:", "Y:", "Z:" }; // Labels for each axis + const uint16_t color[] = { 0xF800, 0x07E0, 0x001F }; // Colors for each value + + // To get the labels right-aligned, one option would be simple trial and + // error to find a column that looks good and doesn't clip anything off. + // Let's do this dynamically though, so it adapts to any font or labels! + // Start by finding the widest of the label strings: + uint16_t w, h, max_w = 0; + int16_t x, y; + for (uint8_t i=0; i<3; i++) { // For each label... + display.getTextBounds(label[i], 0, 0, &x, &y, &w, &h); + if (w > max_w) max_w = w; // Keep track of widest label + } + + // Rounded corners throwing us a curve again. If needed, scoot everything + // to the right a bit on wide displays, down a bit on tall ones. + int16_t y_offset = 0; + if (display.width() > display.height()) max_w += CORNER_RADIUS; + else y_offset = CORNER_RADIUS; + + // Now we have max_w for right-aligning the labels. Before we draw them + // though...in order to perform flicker-free updates, the numbers we show + // will be rendered in either a GFXcanvas1 or GFXcanvas16 object; a 1-bit + // or 16-bit offscreen bitmap, RAM permitting. The correct size for this + // canvas could also be trial-and-errored, but again let's make this adapt + // automatically. The width of the canvas will span from max_w (plus a few + // pixels for padding) to the right edge. But the height? Looking at an + // uppercase 'M' can work in many situations, but some fonts have ascenders + // and descenders on digits, and in some locales a comma (extending below + // the baseline) is the decimal separator. Feed ALL the numeric chars into + // getTextBounds() for a cumulative height: + display.setTextWrap(false); // Keep on one line + display.getTextBounds(F("0123456789.,-"), 0, 0, &x, &y, &w, &h); + + // Now declare a GFXcanvas16 object based on the computed width & height: + GFXcanvas16 canvas16(display.width() - max_w - PADDING, h); + + // Small devices (e.g. ATmega328p) will almost certainly lack enough RAM + // for the canvas. Check if canvas buffer exists. If not, fall back on + // using a 1-bit (rather than 16-bit) canvas. Much more RAM friendly, but + // not as fast to draw. If a project doesn't require super interactive + // updates, consider just going straight for the more compact Canvas1. + if (canvas16.getBuffer()) { + // If here, 16-bit canvas allocated successfully! Point of interest, + // only one canvas is needed for this example, we can reuse it for all + // three numbers because the regions are the same size. + + // display and canvas are independent drawable objects; must explicitly + // set the same custom font to use on the canvas now: + canvas16.setFont(&FreeSansBold18pt7b); + + // Clear display and print labels. Once drawn, these remain untouched. + display.fillScreen(0); + display.setCursor(max_w, -y + y_offset); // Set baseline for first row + for (uint8_t i=0; i<3; i++) print_aligned(display, label[i], GFX_ALIGN_RIGHT); + + // Last part now is to print numbers on the canvas and copy the canvas to + // the display, repeating for several seconds... + uint32_t elapsed, startTime = millis(); + while ((elapsed = (millis() - startTime)) <= PAUSE * 2) { + for (uint8_t i=0; i<3; i++) { // For each label... + canvas16.fillScreen(0); // fillScreen() in this case clears canvas + canvas16.setCursor(0, -y); // Reset baseline for custom font + canvas16.setTextColor(color[i]); + // These aren't real accelerometer readings, just cool-looking numbers. + // Notice we print to the canvas, NOT the display: + canvas16.print(sin(elapsed / 200.0 + (float)i * M_PI * 2.0 / 3.0), 5); + // And HERE is the secret sauce to flicker-free updates. Canvas details + // can be passed to the drawRGBBitmap() function, which fully overwrites + // prior screen contents in that area. yAdvance is font line spacing. + display.drawRGBBitmap(max_w + PADDING, i * FreeSansBold18pt7b.yAdvance + + y_offset, canvas16.getBuffer(), canvas16.width(), + canvas16.height()); + } + } + } else { + // Insufficient RAM for Canvas16. Try declaring a 1-bit canvas instead... + GFXcanvas1 canvas1(display.width() - max_w - PADDING, h); + // If even this smaller object fails, can't proceed, cancel this example. + if (!canvas1.getBuffer()) return; + + // Remainder here is nearly identical to the code above, simply using a + // different canvas type. It's stripped of most comments for brevity. + canvas1.setFont(&FreeSansBold18pt7b); + display.fillScreen(0); + display.setCursor(max_w, -y + y_offset); + for (uint8_t i=0; i<3; i++) print_aligned(display, label[i], GFX_ALIGN_RIGHT); + uint32_t elapsed, startTime = millis(); + while ((elapsed = (millis() - startTime)) <= PAUSE * 2) { + for (uint8_t i=0; i<3; i++) { + canvas1.fillScreen(0); + canvas1.setCursor(0, -y); + canvas1.print(sin(elapsed / 200.0 + (float)i * M_PI * 2.0 / 3.0), 5); + // Here's the secret sauce to flicker-free updates with GFXcanvas1. + // Canvas details can be passed to the drawBitmap() function, and by + // specifying both a foreground AND BACKGROUND color (0), this will fully + // overwrite/erase prior screen contents in that area (vs transparent). + display.drawBitmap(max_w + PADDING, i * FreeSansBold18pt7b.yAdvance + + y_offset, canvas1.getBuffer(), canvas1.width(), + canvas1.height(), color[i], 0); + } + } + } + + // Because canvas object was declared locally to this function, it's freed + // automatically when the function returns; no explicit delete needed. +} // END CANVAS EXAMPLE diff --git a/GC9A01A_Demo_Code/CircuitPython_GC9A01A/blinka_round.bmp b/GC9A01A_Demo_Code/CircuitPython_GC9A01A/blinka_round.bmp new file mode 100644 index 000000000..9c4ce8434 Binary files /dev/null and b/GC9A01A_Demo_Code/CircuitPython_GC9A01A/blinka_round.bmp differ diff --git a/GC9A01A_Demo_Code/CircuitPython_GC9A01A/code.py b/GC9A01A_Demo_Code/CircuitPython_GC9A01A/code.py new file mode 100644 index 000000000..9e8c8fab9 --- /dev/null +++ b/GC9A01A_Demo_Code/CircuitPython_GC9A01A/code.py @@ -0,0 +1,61 @@ +# SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +import displayio +import terminalio +from adafruit_display_text.bitmap_label import Label +import adafruit_imageload +from fourwire import FourWire +from vectorio import Circle +from adafruit_gc9a01a import GC9A01A + +spi = board.SPI() +tft_cs = board.D5 +tft_dc = board.D6 +tft_reset = board.D9 + +displayio.release_displays() + +display_bus = FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=tft_reset) +display = GC9A01A(display_bus, width=240, height=240) + +# --- Default Shapes/Text Demo --- +main_group = displayio.Group() +display.root_group = main_group + +bg_bitmap = displayio.Bitmap(240, 240, 2) +color_palette = displayio.Palette(2) +color_palette[0] = 0x00FF00 # Bright Green +color_palette[1] = 0xAA0088 # Purple + +bg_sprite = displayio.TileGrid(bg_bitmap, pixel_shader=color_palette, x=0, y=0) +main_group.append(bg_sprite) + +inner_circle = Circle(pixel_shader=color_palette, x=120, y=120, radius=100, color_index=1) +main_group.append(inner_circle) + +text_group = displayio.Group(scale=2, x=50, y=120) +text = "Hello World!" +text_area = Label(terminalio.FONT, text=text, color=0xFFFF00) +text_group.append(text_area) # Subgroup for text scaling +main_group.append(text_group) + +# --- ImageLoad Demo --- +blinka_group = displayio.Group() +bitmap, palette = adafruit_imageload.load("/blinka_round.bmp", + bitmap=displayio.Bitmap, + palette=displayio.Palette) + +grid = displayio.TileGrid(bitmap, pixel_shader=palette) +blinka_group.append(grid) + +while True: + # show shapes/text + display.root_group = main_group + time.sleep(2) + # show blinka bitmap + display.root_group = blinka_group + time.sleep(2) diff --git a/GC9A01A_Demo_Code/Python_GC9A01A/blinka_round.jpg b/GC9A01A_Demo_Code/Python_GC9A01A/blinka_round.jpg new file mode 100644 index 000000000..2a7630855 Binary files /dev/null and b/GC9A01A_Demo_Code/Python_GC9A01A/blinka_round.jpg differ diff --git a/GC9A01A_Demo_Code/Python_GC9A01A/code.py b/GC9A01A_Demo_Code/Python_GC9A01A/code.py new file mode 100644 index 000000000..e5ff06116 --- /dev/null +++ b/GC9A01A_Demo_Code/Python_GC9A01A/code.py @@ -0,0 +1,71 @@ +# SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries +# SPDX-FileCopyrightText: Adapted from Melissa LeBlanc-Williams's Pi Demo Code +# +# SPDX-License-Identifier: MIT + +'''Raspberry Pi Graphics example for the 240x240 Round Display''' + +import time +import digitalio +import board +from PIL import Image, ImageDraw, ImageFont +from adafruit_rgb_display import gc9a01a + +BORDER = 20 +FONTSIZE = 24 + +cs_pin = digitalio.DigitalInOut(board.CE0) +dc_pin = digitalio.DigitalInOut(board.D25) +reset_pin = digitalio.DigitalInOut(board.D27) + +BAUDRATE = 24000000 + + +spi = board.SPI() + +disp = gc9a01a.GC9A01A(spi, rotation=0, + width=240, height=240, + x_offset=0, y_offset=0, + cs=cs_pin, + dc=dc_pin, + rst=reset_pin, + baudrate=BAUDRATE, +) + +width = disp.width +height = disp.height + +# -------TEXT AND SHAPES--------- +image1 = Image.new("RGB", (width, height)) +draw1 = ImageDraw.Draw(image1) +draw1.ellipse((0, 0, width, height), fill=(0, 255, 0)) # Green background + +draw1.ellipse( + (BORDER, BORDER, width - BORDER - 1, height - BORDER - 1), fill=(170, 0, 136) +) +font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", FONTSIZE) +text = "Hello World!" +(font_width, font_height) = font.getsize(text) +draw1.text( + (width // 2 - font_width // 2, height // 2 - font_height // 2), + text, + font=font, + fill=(255, 255, 0), +) + +# ------ADABOT JPEG DISPLAY---------- +image2 = Image.open("blinka_round.jpg") +image_ratio = image2.width / image2.height +screen_ratio = width / height +scaled_width = width +scaled_height = image2.height * width // image2.width +image2 = image2.resize((scaled_width, scaled_height), Image.BICUBIC) +x = scaled_width // 2 - width // 2 +y = scaled_height // 2 - height // 2 +image2 = image2.crop((x, y, x + width, y + height)) + +while True: + disp.image(image1) # show text + time.sleep(2) + disp.image(image2) # show adabot + time.sleep(2) diff --git a/GemmaM0_Band_Jacket/DiscoBandCamp/XYmap.h b/GemmaM0_Band_Jacket/DiscoBandCamp/XYmap.h index 07c80b997..17949194f 100644 --- a/GemmaM0_Band_Jacket/DiscoBandCamp/XYmap.h +++ b/GemmaM0_Band_Jacket/DiscoBandCamp/XYmap.h @@ -23,6 +23,7 @@ // XY(x,y) takes x and y coordinates and returns an LED index number, // for use like this: leds[ XY(x,y) ] == CRGB::Red; +#include // Parameters for width and height const uint8_t kMatrixWidth = 24; @@ -37,8 +38,10 @@ CRGB leds[ NUM_LEDS ]; // This code, plus the supporting 80-byte table is much smaller // and much faster than trying to calculate the pixel ID with code. #define LAST_VISIBLE_LED 119 -uint8_t XY( uint8_t x, uint8_t y) +uint16_t XY(uint16_t x, uint16_t y, uint16_t width, uint16_t height) { + (void)width; + (void)height; // any out of bounds address maps to the first hidden pixel if( (x >= kMatrixWidth) || (y >= kMatrixHeight) ) { return (LAST_VISIBLE_LED + 1); @@ -79,3 +82,6 @@ uint8_t XY( uint8_t x, uint8_t y) uint8_t j = JacketTable[i]; return j; } + +// Instantiate an XYMap object +fl::XYMap myXYMap = fl::XYMap::constructWithUserFunction(kMatrixWidth, kMatrixHeight, XY); diff --git a/GemmaM0_Band_Jacket/DiscoBandCamp/effects.h b/GemmaM0_Band_Jacket/DiscoBandCamp/effects.h index ff0e32ea1..bef1f729d 100644 --- a/GemmaM0_Band_Jacket/DiscoBandCamp/effects.h +++ b/GemmaM0_Band_Jacket/DiscoBandCamp/effects.h @@ -4,7 +4,6 @@ // Selection of effects from the FastLED library & Macetech RGB Shades - // Triple Sine Waves void threeSine() { @@ -26,7 +25,7 @@ void threeSine() { byte sinDistanceG = qmul8(abs(y * (255 / kMatrixHeight) - sin8(sineOffset * 10 + x * 16)), 2); byte sinDistanceB = qmul8(abs(y * (255 / kMatrixHeight) - sin8(sineOffset * 11 + x * 16)), 2); - leds[XY(x, y)] = CRGB(255 - sinDistanceR, 255 - sinDistanceG, 255 - sinDistanceB); + leds[XY(x, y, 0, 0)] = CRGB(255 - sinDistanceR, 255 - sinDistanceG, 255 - sinDistanceB); } } @@ -70,7 +69,7 @@ void plasma() { for (int x = 0; x < kMatrixWidth; x++) { for (int y = 0; y < kMatrixHeight; y++) { byte color = sin8(sqrt(sq(((float)x - 7.5) * 10 + xOffset - 127) + sq(((float)y - 2) * 10 + yOffset - 127)) + offset); - leds[XY(x, y)] = CHSV(color, 255, 255); + leds[XY(x, y, 0, 0)] = CHSV(color, 255, 255); } } @@ -100,7 +99,7 @@ void rider() { brightness = 255 - brightness; CRGB riderColor = CHSV(cycleHue, 255, brightness); for (byte y = 0; y < kMatrixHeight; y++) { - leds[XY(x, y)] = riderColor; + leds[XY(x, y, 0, 0)] = riderColor; } } @@ -133,7 +132,7 @@ void colorFill() { for (byte x = 0; x < kMatrixWidth; x++) { byte y = currentRow; if (currentDirection == 2) y = kMatrixHeight - 1 - currentRow; - leds[XY(x, y)] = currentPalette[currentColor]; + leds[XY(x, y, 0, 0)] = currentPalette[currentColor]; } } @@ -143,7 +142,7 @@ void colorFill() { for (byte y = 0; y < kMatrixHeight; y++) { byte x = currentRow; if (currentDirection == 3) x = kMatrixWidth - 1 - currentRow; - leds[XY(x, y)] = currentPalette[currentColor]; + leds[XY(x, y, 0, 0)] = currentPalette[currentColor]; } } @@ -174,8 +173,8 @@ void sideRain() { scrollArray(rainDir); byte randPixel = random8(kMatrixHeight); - for (byte y = 0; y < kMatrixHeight; y++) leds[XY((kMatrixWidth - 1) * rainDir, y)] = CRGB::Black; - leds[XY((kMatrixWidth - 1)*rainDir, randPixel)] = CHSV(cycleHue, 255, 255); + for (byte y = 0; y < kMatrixHeight; y++) leds[XY((kMatrixWidth - 1) * rainDir, y, 0, 0)] = CRGB::Black; + leds[XY((kMatrixWidth - 1)*rainDir, randPixel, 0, 0)] = CHSV(cycleHue, 255, 255); } @@ -194,7 +193,7 @@ void confetti() { // scatter random colored pixels at several random coordinates for (byte i = 0; i < 4; i++) { - leds[XY(random16(kMatrixWidth), random16(kMatrixHeight))] = ColorFromPalette(currentPalette, random16(255), 255); //CHSV(random16(255), 255, 255); + leds[XY(random16(kMatrixWidth), random16(kMatrixHeight), 0, 0)] = ColorFromPalette(currentPalette, random16(255), 255); //CHSV(random16(255), 255, 255); random16_add_entropy(1); } } @@ -233,7 +232,7 @@ void myConfetti() { // scatter random colored pixels at several random coordinates for (byte i = 0; i < 4; i++) { - leds[XY(random16(kMatrixWidth), random16(kMatrixHeight))] = ColorFromPalette(MyColors_p, random16(255), 255); //CHSV(random16(255), 255, 255); + leds[XY(random16(kMatrixWidth), random16(kMatrixHeight), 0, 0)] = ColorFromPalette(MyColors_p, random16(255), 255); //CHSV(random16(255), 255, 255); random16_add_entropy(1); } @@ -263,7 +262,7 @@ void slantBars() { for (byte x = 0; x < kMatrixWidth; x++) { for (byte y = 0; y < kMatrixHeight; y++) { - leds[XY(x, y)] = CHSV(cycleHue, 255, quadwave8(x * 32 + y * 32 + slantPos)); + leds[XY(x, y, 0, 0)] = CHSV(cycleHue, 255, quadwave8(x * 32 + y * 32 + slantPos)); } } @@ -286,7 +285,7 @@ void swirly() // blur it repeatedly. Since the blurring is 'lossy', there's // an automatic trend toward black -- by design. uint8_t blurAmount = beatsin8(2,10,255); - blur2d( leds, kMatrixWidth, kMatrixHeight, blurAmount); + blur2d(leds, kMatrixWidth, kMatrixHeight, blurAmount, myXYMap); // Use two out-of-sync sine waves uint8_t i = beatsin8( 27, kBorderWidth, kMatrixHeight-kBorderWidth); @@ -297,12 +296,12 @@ void swirly() // The color of each point shifts over time, each at a different speed. uint16_t ms = millis(); - leds[XY( i, j)] += CHSV( ms / 11, 200, 255); - leds[XY( j, i)] += CHSV( ms / 13, 200, 255); - leds[XY(ni,nj)] += CHSV( ms / 17, 200, 255); - leds[XY(nj,ni)] += CHSV( ms / 29, 200, 255); - leds[XY( i,nj)] += CHSV( ms / 37, 200, 255); - leds[XY(ni, j)] += CHSV( ms / 41, 200, 255); + leds[XY(i, j, 0, 0)] += CHSV( ms / 11, 200, 255); + leds[XY(j, i, 0, 0)] += CHSV( ms / 13, 200, 255); + leds[XY(ni,nj, 0, 0)] += CHSV( ms / 17, 200, 255); + leds[XY(nj,ni, 0, 0)] += CHSV( ms / 29, 200, 255); + leds[XY(i,nj, 0, 0)] += CHSV( ms / 37, 200, 255); + leds[XY(ni, j, 0, 0)] += CHSV( ms / 41, 200, 255); FastLED.show(); } diff --git a/GemmaM0_Band_Jacket/DiscoBandCamp/utils.h b/GemmaM0_Band_Jacket/DiscoBandCamp/utils.h index 4891c342f..7c97afc23 100644 --- a/GemmaM0_Band_Jacket/DiscoBandCamp/utils.h +++ b/GemmaM0_Band_Jacket/DiscoBandCamp/utils.h @@ -3,7 +3,6 @@ // SPDX-License-Identifier: MIT // Assorted useful functions and variables - // Global variables boolean effectInit = false; // indicates if a pattern has been recently switched uint16_t effectDelay = 0; // time between automatic effect changes @@ -68,7 +67,7 @@ void scrollArray(byte scrollDir) { } for (byte y = 0; y < kMatrixHeight; y++) { - leds[XY(scrollX,y)] = leds[XY(scrollX + scrollDir*2 - 1,y)]; + leds[XY(scrollX,y,0,0)] = leds[XY(scrollX + scrollDir*2 - 1,y,0,0)]; } } @@ -177,7 +176,7 @@ void mapNoiseToLEDsUsingPalette() } CRGB color = ColorFromPalette( currentPalette, index, bri); - leds[XY(i,j)] = color; + leds[XY(i,j,0,0)] = color; } } diff --git a/Gravity_Falls_Memory_Gun/Arial-14.bdf b/Gravity_Falls_Memory_Gun/Arial-14.bdf new file mode 100644 index 000000000..a92736e1a --- /dev/null +++ b/Gravity_Falls_Memory_Gun/Arial-14.bdf @@ -0,0 +1,27566 @@ +STARTFONT 2.1 +COMMENT +COMMENT Converted from OpenType font "arial.ttf" by "otf2bdf 3.0". +COMMENT +FONT -FreeType-Arial-Medium-R-Normal--19-140-100-100-P-94-ISO10646-1 +SIZE 14 100 100 +FONTBOUNDINGBOX 34 26 -13 -6 +STARTPROPERTIES 19 +FOUNDRY "FreeType" +FAMILY_NAME "Arial" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 19 +POINT_SIZE 140 +RESOLUTION_X 100 +RESOLUTION_Y 100 +SPACING "P" +AVERAGE_WIDTH 94 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONT_ASCENT 17 +FONT_DESCENT 4 +COPYRIGHT "Typeface © The Monotype Corporation plc. Data © The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved" +_OTF_FONTFILE "arial.ttf" +_OTF_PSNAME "ArialMT" +ENDPROPERTIES +CHARS 1419 +STARTCHAR 0020 +ENCODING 32 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0021 +ENCODING 33 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +00 +C0 +C0 +ENDCHAR +STARTCHAR 0022 +ENCODING 34 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 5 1 9 +BITMAP +D8 +D8 +D8 +D8 +90 +ENDCHAR +STARTCHAR 0023 +ENCODING 35 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0880 +0880 +1880 +FFC0 +FFC0 +1100 +3100 +3100 +FFC0 +FFC0 +2200 +6200 +6200 +4600 +ENDCHAR +STARTCHAR 0024 +ENCODING 36 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -2 +BITMAP +0800 +3E00 +7F00 +CB00 +C800 +C800 +7800 +3E00 +0F00 +0900 +0980 +C980 +CB00 +7F00 +3E00 +0800 +0800 +ENDCHAR +STARTCHAR 0025 +ENCODING 37 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +7830 +4C20 +CC40 +CC40 +CC80 +4880 +7900 +0338 +0264 +0646 +0446 +0C46 +0864 +1838 +ENDCHAR +STARTCHAR 0026 +ENCODING 38 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1E00 +3F00 +3300 +2300 +3300 +1E00 +3C00 +7C00 +C6C0 +C3C0 +C180 +E3C0 +7FE0 +3C60 +ENDCHAR +STARTCHAR 0027 +ENCODING 39 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +C0 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR 0028 +ENCODING 40 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 18 1 -4 +BITMAP +10 +30 +20 +60 +60 +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +60 +60 +20 +30 +10 +ENDCHAR +STARTCHAR 0029 +ENCODING 41 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 18 1 -4 +BITMAP +C0 +40 +60 +20 +30 +10 +10 +18 +18 +18 +18 +10 +10 +30 +20 +60 +40 +C0 +ENDCHAR +STARTCHAR 002A +ENCODING 42 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 6 1 8 +BITMAP +20 +20 +FC +30 +50 +48 +ENDCHAR +STARTCHAR 002B +ENCODING 43 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 1 +BITMAP +0800 +0800 +0800 +0800 +FF80 +FF80 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 002C +ENCODING 44 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 5 2 -3 +BITMAP +C0 +C0 +40 +80 +80 +ENDCHAR +STARTCHAR 002D +ENCODING 45 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 2 1 4 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR 002E +ENCODING 46 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 2 2 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 002F +ENCODING 47 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +08 +08 +18 +10 +10 +30 +20 +20 +20 +60 +40 +40 +C0 +80 +ENDCHAR +STARTCHAR 0030 +ENCODING 48 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +6300 +C300 +C100 +C180 +C180 +C180 +C180 +C100 +C300 +E300 +7E00 +3C00 +ENDCHAR +STARTCHAR 0031 +ENCODING 49 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 5 14 2 0 +BITMAP +08 +18 +38 +F8 +98 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 0032 +ENCODING 50 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3E00 +7F00 +C300 +C180 +0180 +0300 +0300 +0600 +1C00 +3800 +6000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 0033 +ENCODING 51 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +C300 +C300 +0300 +1E00 +1F00 +0300 +0180 +0180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0034 +ENCODING 52 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0300 +0700 +0700 +0F00 +1B00 +1300 +3300 +6300 +4300 +FFC0 +FFC0 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 0035 +ENCODING 53 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +7F00 +7F00 +6000 +4000 +4000 +DE00 +FF00 +C300 +0180 +0180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0036 +ENCODING 54 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3E00 +7F00 +6300 +C100 +C000 +9E00 +BF00 +E300 +C180 +C180 +C180 +E300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0037 +ENCODING 55 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +FF80 +FF80 +0300 +0600 +0600 +0C00 +0C00 +1800 +1800 +1000 +3000 +3000 +3000 +3000 +ENDCHAR +STARTCHAR 0038 +ENCODING 56 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +6300 +C300 +C300 +6300 +3E00 +7E00 +C300 +C180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 0039 +ENCODING 57 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +E300 +C100 +C180 +C180 +C380 +7F80 +3D80 +0180 +C300 +C300 +7E00 +3C00 +ENDCHAR +STARTCHAR 003A +ENCODING 58 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 10 2 0 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR 003B +ENCODING 59 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 13 2 -3 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +40 +80 +80 +ENDCHAR +STARTCHAR 003C +ENCODING 60 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 2 +BITMAP +0080 +0380 +1F00 +7800 +C000 +7800 +1F00 +0380 +0080 +ENDCHAR +STARTCHAR 003D +ENCODING 61 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 6 1 4 +BITMAP +FF80 +FF80 +0000 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR 003E +ENCODING 62 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 2 +BITMAP +8000 +E000 +7C00 +0F00 +0180 +0F00 +7C00 +E000 +8000 +ENDCHAR +STARTCHAR 003F +ENCODING 63 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3E00 +7F00 +C300 +C180 +0180 +0300 +0600 +0C00 +0C00 +1800 +1800 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 0040 +ENCODING 64 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 18 1 -4 +BITMAP +03F000 +0FFC00 +1C0E00 +300300 +61D980 +47F980 +C63880 +CC1080 +8C1080 +883180 +883100 +CC7700 +CFFE00 +67BC00 +700180 +3C0700 +1FFE00 +03F800 +ENDCHAR +STARTCHAR 0041 +ENCODING 65 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0042 +ENCODING 66 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF00 +FF80 +C0C0 +C0C0 +C0C0 +C0C0 +FF80 +FF80 +C0C0 +C060 +C060 +C0C0 +FFC0 +FF80 +ENDCHAR +STARTCHAR 0043 +ENCODING 67 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 0044 +ENCODING 68 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +FF00 +FFC0 +C0E0 +C060 +C020 +C030 +C030 +C030 +C030 +C060 +C060 +C0E0 +FFC0 +FF00 +ENDCHAR +STARTCHAR 0045 +ENCODING 69 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0046 +ENCODING 70 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 9 14 2 0 +BITMAP +FF80 +FF80 +8000 +8000 +8000 +8000 +FF00 +FF00 +8000 +8000 +8000 +8000 +8000 +8000 +ENDCHAR +STARTCHAR 0047 +ENCODING 71 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 0048 +ENCODING 72 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 0049 +ENCODING 73 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 004A +ENCODING 74 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 14 1 0 +BITMAP +06 +06 +06 +06 +06 +06 +06 +06 +06 +06 +86 +C6 +FC +78 +ENDCHAR +STARTCHAR 004B +ENCODING 75 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +FC00 +F600 +E700 +C300 +C180 +C0C0 +C0E0 +C060 +ENDCHAR +STARTCHAR 004C +ENCODING 76 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 004D +ENCODING 77 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 14 1 0 +BITMAP +E018 +F038 +F028 +D028 +D868 +D868 +C848 +CCC8 +CCC8 +C488 +C788 +C788 +C308 +C308 +ENDCHAR +STARTCHAR 004E +ENCODING 78 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 004F +ENCODING 79 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 0050 +ENCODING 80 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF80 +FFC0 +C0E0 +C060 +C060 +C060 +C0C0 +FFC0 +FF80 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0051 +ENCODING 81 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 15 1 -1 +BITMAP +0F80 +3FE0 +7070 +6030 +C038 +C018 +C018 +C018 +C018 +C030 +61B0 +70E0 +3FE0 +0FB8 +0008 +ENDCHAR +STARTCHAR 0052 +ENCODING 82 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +FFC0 +FFE0 +C060 +C060 +C060 +C060 +FFE0 +FF80 +C300 +C180 +C0C0 +C060 +C060 +C030 +ENDCHAR +STARTCHAR 0053 +ENCODING 83 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0054 +ENCODING 84 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0055 +ENCODING 85 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0056 +ENCODING 86 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +C010 +6030 +6030 +6060 +3060 +3040 +10C0 +18C0 +1880 +0980 +0D80 +0D00 +0700 +0600 +ENDCHAR +STARTCHAR 0057 +ENCODING 87 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 14 0 0 +BITMAP +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 0058 +ENCODING 88 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +6030 +3060 +30C0 +18C0 +0D80 +0F00 +0700 +0700 +0D80 +1980 +18C0 +3060 +6070 +E030 +ENDCHAR +STARTCHAR 0059 +ENCODING 89 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 005A +ENCODING 90 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 005B +ENCODING 91 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 18 1 -4 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR 005C +ENCODING 92 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +80 +C0 +40 +40 +60 +20 +20 +20 +30 +10 +10 +18 +08 +08 +ENDCHAR +STARTCHAR 005D +ENCODING 93 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 18 0 -4 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR 005E +ENCODING 94 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 7 1 7 +BITMAP +10 +38 +28 +6C +44 +C6 +82 +ENDCHAR +STARTCHAR 005F +ENCODING 95 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 2 0 -4 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0060 +ENCODING 96 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 3 1 11 +BITMAP +C0 +60 +20 +ENDCHAR +STARTCHAR 0061 +ENCODING 97 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 0062 +ENCODING 98 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DC00 +ENDCHAR +STARTCHAR 0063 +ENCODING 99 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 0064 +ENCODING 100 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +01 +01 +01 +01 +39 +7D +C3 +C3 +81 +81 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 0065 +ENCODING 101 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0066 +ENCODING 102 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 14 0 0 +BITMAP +1C +3C +20 +20 +F8 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0067 +ENCODING 103 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +01 +C3 +FE +7C +ENDCHAR +STARTCHAR 0068 +ENCODING 104 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 0069 +ENCODING 105 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 006A +ENCODING 106 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 18 -1 -4 +BITMAP +30 +30 +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 006B +ENCODING 107 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +C7 +CE +DC +F8 +F8 +D8 +CC +C6 +C6 +C3 +ENDCHAR +STARTCHAR 006C +ENCODING 108 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 006D +ENCODING 109 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 10 1 0 +BITMAP +DC70 +FEF8 +E38C +C30C +C30C +C30C +C30C +C30C +C30C +C30C +ENDCHAR +STARTCHAR 006E +ENCODING 110 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 10 1 0 +BITMAP +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 006F +ENCODING 111 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0070 +ENCODING 112 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DC00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0071 +ENCODING 113 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +39 +7D +C3 +C3 +81 +81 +C3 +C3 +7D +39 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 0072 +ENCODING 114 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 10 1 0 +BITMAP +DC +F8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0073 +ENCODING 115 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 0074 +ENCODING 116 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +20 +20 +20 +F8 +F8 +20 +20 +20 +20 +20 +20 +38 +38 +ENDCHAR +STARTCHAR 0075 +ENCODING 117 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 10 1 0 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 0076 +ENCODING 118 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +C180 +6180 +6100 +2300 +3300 +3200 +1600 +1C00 +1C00 +0C00 +ENDCHAR +STARTCHAR 0077 +ENCODING 119 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 10 0 0 +BITMAP +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 0078 +ENCODING 120 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +6180 +6300 +3600 +1E00 +0C00 +1C00 +1E00 +3300 +6300 +E180 +ENDCHAR +STARTCHAR 0079 +ENCODING 121 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 007A +ENCODING 122 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +7F80 +7F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FF80 +FF80 +ENDCHAR +STARTCHAR 007B +ENCODING 123 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 18 1 -4 +BITMAP +38 +38 +60 +60 +60 +60 +60 +60 +C0 +C0 +60 +60 +60 +60 +60 +20 +38 +38 +ENDCHAR +STARTCHAR 007C +ENCODING 124 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 1 18 2 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 007D +ENCODING 125 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 18 0 -4 +BITMAP +E0 +F0 +30 +30 +30 +30 +30 +18 +1C +1C +18 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 007E +ENCODING 126 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 4 1 4 +BITMAP +7000 +FC80 +8F80 +0700 +ENDCHAR +STARTCHAR 00A0 +ENCODING 160 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 00A1 +ENCODING 161 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 14 2 -4 +BITMAP +C0 +C0 +00 +40 +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00A2 +ENCODING 162 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 -4 +BITMAP +02 +02 +02 +06 +3C +7F +E7 +C8 +C8 +C8 +D1 +F3 +7F +3C +20 +20 +20 +40 +ENDCHAR +STARTCHAR 00A3 +ENCODING 163 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +1F00 +3F80 +30C0 +6000 +6000 +2000 +FE00 +FE00 +3000 +3000 +2000 +7C40 +FFC0 +4380 +ENDCHAR +STARTCHAR 00A4 +ENCODING 164 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 8 1 2 +BITMAP +9D +FF +63 +C1 +C1 +63 +FF +9D +ENDCHAR +STARTCHAR 00A5 +ENCODING 165 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +C0C0 +60C0 +6180 +3180 +3300 +1B00 +1E00 +7FC0 +7FC0 +0C00 +7FC0 +7FC0 +0C00 +0C00 +ENDCHAR +STARTCHAR 00A6 +ENCODING 166 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 1 18 2 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +00 +00 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 00A7 +ENCODING 167 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +3C00 +7E00 +6300 +6000 +7000 +7C00 +8E00 +8300 +C180 +E180 +3900 +1E00 +0600 +0300 +C300 +6300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00A8 +ENCODING 168 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 2 1 12 +BITMAP +98 +98 +ENDCHAR +STARTCHAR 00A9 +ENCODING 169 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +0FC0 +1860 +2010 +4788 +CC4C +8804 +9804 +9804 +8844 +CCCC +4788 +2010 +1860 +0FC0 +ENDCHAR +STARTCHAR 00AA +ENCODING 170 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 7 0 7 +BITMAP +3C +44 +04 +7C +C4 +4C +7C +ENDCHAR +STARTCHAR 00AB +ENCODING 171 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 9 1 1 +BITMAP +13 +32 +26 +64 +CC +64 +26 +32 +13 +ENDCHAR +STARTCHAR 00AC +ENCODING 172 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 6 1 4 +BITMAP +FF80 +FF80 +0180 +0180 +0180 +0180 +ENDCHAR +STARTCHAR 00AD +ENCODING 173 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 2 1 4 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR 00AE +ENCODING 174 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +0FC0 +1860 +2010 +4F88 +C8CC +88C4 +8F84 +8904 +8884 +C8CC +4848 +2010 +1860 +0FC0 +ENDCHAR +STARTCHAR 00AF +ENCODING 175 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 2 0 15 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00B0 +ENCODING 176 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 5 5 1 9 +BITMAP +70 +C8 +88 +C8 +70 +ENDCHAR +STARTCHAR 00B1 +ENCODING 177 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +1800 +1800 +1800 +1800 +FF80 +FF80 +1800 +1800 +1800 +FF80 +FF80 +ENDCHAR +STARTCHAR 00B2 +ENCODING 178 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 7 0 7 +BITMAP +78 +4C +0C +18 +30 +60 +FC +ENDCHAR +STARTCHAR 00B3 +ENCODING 179 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 7 0 7 +BITMAP +78 +4C +0C +18 +0C +CC +78 +ENDCHAR +STARTCHAR 00B4 +ENCODING 180 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 3 2 11 +BITMAP +60 +40 +C0 +ENDCHAR +STARTCHAR 00B5 +ENCODING 181 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C1 +E3 +FF +DD +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00B6 +ENCODING 182 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 17 0 -3 +BITMAP +3FC0 +7FC0 +F980 +F980 +F980 +F980 +7980 +3980 +0980 +0980 +0980 +0980 +0980 +0980 +0980 +0980 +0980 +ENDCHAR +STARTCHAR 00B7 +ENCODING 183 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 2 2 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 00B8 +ENCODING 184 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 4 1 -4 +BITMAP +60 +70 +30 +E0 +ENDCHAR +STARTCHAR 00B9 +ENCODING 185 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 7 1 7 +BITMAP +20 +60 +E0 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR 00BA +ENCODING 186 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 7 0 7 +BITMAP +38 +44 +44 +C6 +44 +44 +38 +ENDCHAR +STARTCHAR 00BB +ENCODING 187 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 7 9 2 1 +BITMAP +98 +C8 +4C +66 +36 +66 +4C +C8 +98 +ENDCHAR +STARTCHAR 00BC +ENCODING 188 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +2018 +6030 +E020 +A040 +20C0 +2080 +2100 +030C +061C +041C +082C +186C +307E +200C +ENDCHAR +STARTCHAR 00BD +ENCODING 189 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +2010 +6030 +E020 +A040 +20C0 +2180 +2100 +023C +0664 +0C04 +080C +1018 +3030 +607E +ENDCHAR +STARTCHAR 00BE +ENCODING 190 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 16 14 0 0 +BITMAP +780C +4C18 +0C10 +1820 +0C60 +CC40 +7880 +0186 +030E +020E +0416 +0C36 +183F +1006 +ENDCHAR +STARTCHAR 00BF +ENCODING 191 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 9 14 1 -4 +BITMAP +0C00 +0C00 +0000 +0C00 +0C00 +0800 +1800 +3000 +6000 +4000 +C180 +6180 +7F00 +1E00 +ENDCHAR +STARTCHAR 00C0 +ENCODING 192 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0600 +0600 +0200 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C1 +ENCODING 193 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0300 +0200 +0600 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C2 +ENCODING 194 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0600 +0F00 +0980 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C3 +ENCODING 195 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0C80 +1F80 +1B80 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C4 +ENCODING 196 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 17 0 0 +BITMAP +0980 +0980 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C5 +ENCODING 197 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0600 +0900 +0900 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C6 +ENCODING 198 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 18 14 0 0 +BITMAP +03FFC0 +03FFC0 +066000 +066000 +0C6000 +0C6000 +087F80 +187F80 +1FE000 +3FE000 +306000 +606000 +607FC0 +C07FC0 +ENDCHAR +STARTCHAR 00C7 +ENCODING 199 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +0400 +0600 +0300 +0E00 +ENDCHAR +STARTCHAR 00C8 +ENCODING 200 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0C00 +0C00 +0600 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00C9 +ENCODING 201 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0600 +0600 +0C00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00CA +ENCODING 202 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +0A00 +1B00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00CB +ENCODING 203 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +1B00 +1B00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00CC +ENCODING 204 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 3 18 1 0 +BITMAP +C0 +40 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 00CD +ENCODING 205 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 18 2 0 +BITMAP +C0 +C0 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00CE +ENCODING 206 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 18 0 0 +BITMAP +70 +58 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00CF +ENCODING 207 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 17 0 0 +BITMAP +D8 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00D0 +ENCODING 208 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +7F80 +7FE0 +6070 +6030 +6010 +6018 +FE18 +FE18 +6018 +6030 +6030 +6070 +7FE0 +7F80 +ENDCHAR +STARTCHAR 00D1 +ENCODING 209 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0C80 +1F80 +1300 +0000 +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 00D2 +ENCODING 210 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0C00 +0600 +0200 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D3 +ENCODING 211 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0300 +0300 +0600 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D4 +ENCODING 212 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0700 +0D00 +0D80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D5 +ENCODING 213 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0EC0 +0F80 +1B80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D6 +ENCODING 214 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 17 1 0 +BITMAP +0D80 +0D80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D7 +ENCODING 215 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 7 7 2 3 +BITMAP +82 +C6 +7C +38 +7C +C6 +82 +ENDCHAR +STARTCHAR 00D8 +ENCODING 216 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 15 1 -1 +BITMAP +0F88 +3FD0 +7060 +6070 +C0D0 +C198 +C318 +C618 +CC18 +D818 +7030 +7070 +7FE0 +DF80 +8000 +ENDCHAR +STARTCHAR 00D9 +ENCODING 217 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0C00 +0400 +0600 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DA +ENCODING 218 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0300 +0600 +0400 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DB +ENCODING 219 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0600 +0F00 +1900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DC +ENCODING 220 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 17 1 0 +BITMAP +1900 +1900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DD +ENCODING 221 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0300 +0300 +0600 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 00DE +ENCODING 222 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C000 +C000 +C000 +FF80 +FFC0 +C0E0 +C060 +C060 +C0E0 +FFC0 +FF80 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 00DF +ENCODING 223 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +3C00 +7E00 +6300 +C300 +C200 +C600 +C400 +C600 +C380 +C1C0 +C0C0 +D8C0 +CFC0 +C780 +ENDCHAR +STARTCHAR 00E0 +ENCODING 224 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3800 +1800 +0800 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E1 +ENCODING 225 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E2 +ENCODING 226 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E3 +ENCODING 227 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3200 +7E00 +4E00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E4 +ENCODING 228 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2600 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E5 +ENCODING 229 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +1800 +2400 +2400 +2400 +1800 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E6 +ENCODING 230 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 10 1 0 +BITMAP +3E78 +7FFC +C386 +0F06 +7FFE +F3FE +8300 +C786 +FFFC +7878 +ENDCHAR +STARTCHAR 00E7 +ENCODING 231 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +10 +18 +0C +38 +ENDCHAR +STARTCHAR 00E8 +ENCODING 232 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3000 +1800 +0800 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00E9 +ENCODING 233 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00EA +ENCODING 234 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00EB +ENCODING 235 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2600 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00EC +ENCODING 236 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 3 14 1 0 +BITMAP +C0 +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 00ED +ENCODING 237 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 3 14 2 0 +BITMAP +60 +C0 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00EE +ENCODING 238 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +30 +78 +C8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00EF +ENCODING 239 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +C8 +C8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00F0 +ENCODING 240 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3200 +1E00 +3C00 +2600 +3B00 +7F00 +C300 +C180 +8180 +8180 +C180 +E300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F1 +ENCODING 241 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +3B +3E +6E +00 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 00F2 +ENCODING 242 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3000 +1800 +0800 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F3 +ENCODING 243 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F4 +ENCODING 244 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F5 +ENCODING 245 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3200 +7E00 +4E00 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F6 +ENCODING 246 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2600 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F7 +ENCODING 247 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 8 1 2 +BITMAP +1800 +1800 +0000 +FF80 +FF80 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 00F8 +ENCODING 248 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 9 12 1 -1 +BITMAP +0080 +1E80 +7F00 +6380 +C680 +C480 +C880 +D180 +7380 +7F00 +5E00 +8000 +ENDCHAR +STARTCHAR 00F9 +ENCODING 249 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +18 +18 +0C +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 00FA +ENCODING 250 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +0C +0C +18 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 00FB +ENCODING 251 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +18 +3C +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 00FC +ENCODING 252 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 13 1 0 +BITMAP +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 00FD +ENCODING 253 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +0C +08 +18 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 00FE +ENCODING 254 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +C000 +C000 +C000 +C000 +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DC00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 00FF +ENCODING 255 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 17 1 -4 +BITMAP +64 +64 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0100 +ENCODING 256 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 16 0 0 +BITMAP +1F80 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0101 +ENCODING 257 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +3E00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 0102 +ENCODING 258 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0880 +0980 +0700 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0103 +ENCODING 259 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 0104 +ENCODING 260 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 18 0 -4 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +0010 +0020 +0030 +001C +ENDCHAR +STARTCHAR 0105 +ENCODING 261 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 14 1 -4 +BITMAP +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +0100 +0100 +0100 +01E0 +ENDCHAR +STARTCHAR 0106 +ENCODING 262 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0300 +0300 +0600 +0000 +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 0107 +ENCODING 263 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +08 +18 +00 +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 0108 +ENCODING 264 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0600 +0F00 +0980 +0000 +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 0109 +ENCODING 265 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +1C +14 +36 +00 +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 010A +ENCODING 266 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 17 1 0 +BITMAP +0600 +0600 +0000 +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 010B +ENCODING 267 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +18 +18 +00 +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 010C +ENCODING 268 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0D80 +0D00 +0700 +0000 +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 010D +ENCODING 269 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +26 +3C +18 +00 +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 010E +ENCODING 270 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +3600 +1400 +1C00 +0000 +FF00 +FFC0 +C0E0 +C060 +C020 +C030 +C030 +C030 +C030 +C060 +C060 +C0E0 +FFC0 +FF00 +ENDCHAR +STARTCHAR 010F +ENCODING 271 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +0160 +0160 +0120 +0140 +3D00 +7F00 +C300 +C300 +8100 +8100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 0110 +ENCODING 272 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +7F80 +7FE0 +6070 +6030 +6010 +6018 +FE18 +FE18 +6018 +6030 +6030 +6070 +7FE0 +7F80 +ENDCHAR +STARTCHAR 0111 +ENCODING 273 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +0100 +1FC0 +1FC0 +0100 +3900 +7D00 +C300 +C300 +8100 +8100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 0112 +ENCODING 274 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 16 1 0 +BITMAP +1F80 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0113 +ENCODING 275 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +7E00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0114 +ENCODING 276 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1100 +1100 +0E00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0115 +ENCODING 277 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +2200 +2200 +1C00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0116 +ENCODING 278 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +0600 +0600 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0117 +ENCODING 279 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +1C00 +1C00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0118 +ENCODING 280 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +0100 +0100 +0100 +01E0 +ENDCHAR +STARTCHAR 0119 +ENCODING 281 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +0800 +0800 +0800 +0F00 +ENDCHAR +STARTCHAR 011A +ENCODING 282 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1300 +1E00 +0C00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 011B +ENCODING 283 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3600 +3400 +1C00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 011C +ENCODING 284 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0300 +0780 +0CC0 +0000 +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 011D +ENCODING 285 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 -4 +BITMAP +18 +3C +66 +00 +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +01 +C3 +FE +7C +ENDCHAR +STARTCHAR 011E +ENCODING 286 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0C40 +0480 +0780 +0000 +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 011F +ENCODING 287 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 -4 +BITMAP +22 +26 +1C +00 +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +01 +C3 +FE +7C +ENDCHAR +STARTCHAR 0120 +ENCODING 288 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 17 1 0 +BITMAP +0300 +0300 +0000 +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 0121 +ENCODING 289 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 17 1 -4 +BITMAP +18 +18 +00 +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +01 +C3 +FE +7C +ENDCHAR +STARTCHAR 0122 +ENCODING 290 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 -4 +BITMAP +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +0300 +0380 +0180 +0700 +ENDCHAR +STARTCHAR 0123 +ENCODING 291 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 19 1 -4 +BITMAP +08 +10 +18 +18 +00 +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 0124 +ENCODING 292 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 18 2 0 +BITMAP +0C00 +1E00 +1300 +0000 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 0125 +ENCODING 293 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 0 +BITMAP +0C +1E +33 +00 +C0 +C0 +C0 +C0 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 0126 +ENCODING 294 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +2030 +FFF8 +FFF8 +2030 +2030 +3FF0 +3FF0 +2030 +2030 +2030 +2030 +2030 +2030 +2030 +ENDCHAR +STARTCHAR 0127 +ENCODING 295 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 0 0 +BITMAP +6000 +FC00 +FC00 +6000 +6F00 +7F80 +7180 +6080 +6080 +6080 +6080 +6080 +6080 +6080 +ENDCHAR +STARTCHAR 0128 +ENCODING 296 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 7 18 -1 0 +BITMAP +76 +7C +DC +00 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 0129 +ENCODING 297 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 14 0 0 +BITMAP +EC +FC +98 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012A +ENCODING 298 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 16 0 0 +BITMAP +FC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012B +ENCODING 299 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 0 0 +BITMAP +FC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012C +ENCODING 300 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 18 0 0 +BITMAP +88 +C8 +70 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012D +ENCODING 301 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +88 +C8 +70 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012E +ENCODING 302 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 18 2 -4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR 012F +ENCODING 303 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 18 1 -4 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +70 +ENDCHAR +STARTCHAR 0130 +ENCODING 304 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 17 2 0 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0131 +ENCODING 305 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 10 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0132 +ENCODING 306 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 2 0 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C860 +CC60 +CFC0 +C780 +ENDCHAR +STARTCHAR 0133 +ENCODING 307 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 18 1 -4 +BITMAP +C4 +C4 +00 +00 +C4 +C4 +C4 +C4 +C4 +C4 +C4 +C4 +C4 +C4 +04 +04 +1C +1C +ENDCHAR +STARTCHAR 0134 +ENCODING 308 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 18 1 0 +BITMAP +0700 +0D00 +0D80 +0000 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +8600 +C600 +FC00 +7800 +ENDCHAR +STARTCHAR 0135 +ENCODING 309 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 6 18 -1 -4 +BITMAP +30 +78 +4C +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0136 +ENCODING 310 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +FC00 +F600 +E700 +C300 +C180 +C0C0 +C0E0 +C060 +0000 +0700 +0100 +0F00 +ENDCHAR +STARTCHAR 0137 +ENCODING 311 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +C0 +C0 +C0 +C0 +C7 +CE +DC +F8 +F8 +D8 +CC +C6 +C6 +C3 +00 +0C +06 +1C +ENDCHAR +STARTCHAR 0138 +ENCODING 312 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C7 +CE +D8 +F0 +F8 +C8 +CC +C6 +C6 +C3 +ENDCHAR +STARTCHAR 0139 +ENCODING 313 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +1800 +3000 +3000 +0000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 013A +ENCODING 314 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 18 1 0 +BITMAP +60 +C0 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 013B +ENCODING 315 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +0000 +0E00 +0200 +1E00 +ENDCHAR +STARTCHAR 013C +ENCODING 316 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 18 0 -4 +BITMAP +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +00 +70 +30 +E0 +ENDCHAR +STARTCHAR 013D +ENCODING 317 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C300 +C300 +C200 +C200 +C200 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 013E +ENCODING 318 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 14 1 0 +BITMAP +D8 +D8 +D0 +D0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 013F +ENCODING 319 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C300 +C300 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 0140 +ENCODING 320 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +D8 +D8 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0141 +ENCODING 321 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +6000 +6000 +6000 +6400 +6C00 +7800 +7000 +E000 +E000 +6000 +6000 +6000 +7FC0 +7FC0 +ENDCHAR +STARTCHAR 0142 +ENCODING 322 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 14 0 0 +BITMAP +60 +60 +60 +60 +70 +70 +60 +E0 +E0 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 0143 +ENCODING 323 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0600 +0600 +0400 +0000 +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 0144 +ENCODING 324 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +0C +0C +18 +00 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 0145 +ENCODING 325 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 -4 +BITMAP +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +0000 +0700 +0180 +0700 +ENDCHAR +STARTCHAR 0146 +ENCODING 326 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +00 +1C +04 +3C +ENDCHAR +STARTCHAR 0147 +ENCODING 327 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +1900 +0F00 +0600 +0000 +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 0148 +ENCODING 328 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +36 +34 +1C +00 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 0149 +ENCODING 329 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +C000 +C000 +4000 +8000 +B780 +3FC0 +38C0 +30C0 +30C0 +30C0 +30C0 +30C0 +30C0 +30C0 +ENDCHAR +STARTCHAR 014A +ENCODING 330 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 2 0 +BITMAP +9F00 +BF80 +E1C0 +C0C0 +C060 +8060 +8060 +8060 +8060 +8060 +80C0 +80C0 +8780 +8F00 +ENDCHAR +STARTCHAR 014B +ENCODING 331 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +01 +03 +07 +06 +ENDCHAR +STARTCHAR 014C +ENCODING 332 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 16 1 0 +BITMAP +0F80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 014D +ENCODING 333 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +7E00 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 014E +ENCODING 334 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0880 +0880 +0700 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 014F +ENCODING 335 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +2200 +2600 +1C00 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0150 +ENCODING 336 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0CC0 +0D80 +0900 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 0151 +ENCODING 337 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1B00 +3600 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0152 +ENCODING 338 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 14 1 0 +BITMAP +1F7F80 +3FFF80 +71E000 +60E000 +C06000 +C06000 +C07F80 +C07F80 +C06000 +C06000 +60E000 +71E000 +3FFF80 +1F7F80 +ENDCHAR +STARTCHAR 0153 +ENCODING 339 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 16 10 1 0 +BITMAP +3C3C +7F7E +E3C3 +C183 +C1FF +C1FF +C180 +E3C3 +7F7E +3C3C +ENDCHAR +STARTCHAR 0154 +ENCODING 340 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0600 +0C00 +0800 +0000 +FFC0 +FFE0 +C060 +C060 +C060 +C060 +FFE0 +FF80 +C300 +C180 +C0C0 +C060 +C060 +C030 +ENDCHAR +STARTCHAR 0155 +ENCODING 341 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 14 1 0 +BITMAP +30 +30 +60 +00 +DC +F8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0156 +ENCODING 342 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +FFC0 +FFE0 +C060 +C060 +C060 +C060 +FFE0 +FF80 +C300 +C180 +C0C0 +C060 +C060 +C030 +0000 +0700 +0180 +0700 +ENDCHAR +STARTCHAR 0157 +ENCODING 343 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 14 1 -4 +BITMAP +DC +F8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +70 +10 +F0 +ENDCHAR +STARTCHAR 0158 +ENCODING 344 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +3300 +1E00 +0C00 +0000 +FFC0 +FFE0 +C060 +C060 +C060 +C060 +FFE0 +FF80 +C300 +C180 +C0C0 +C060 +C060 +C030 +ENDCHAR +STARTCHAR 0159 +ENCODING 345 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 14 1 0 +BITMAP +D8 +50 +70 +00 +DC +F8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 015A +ENCODING 346 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0600 +0C00 +0800 +0000 +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 015B +ENCODING 347 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +18 +10 +00 +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 015C +ENCODING 348 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0C00 +1A00 +1300 +0000 +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 015D +ENCODING 349 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +18 +3C +66 +00 +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 015E +ENCODING 350 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +0400 +0E00 +0200 +1C00 +ENDCHAR +STARTCHAR 015F +ENCODING 351 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +10 +18 +08 +38 +ENDCHAR +STARTCHAR 0160 +ENCODING 352 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +3300 +1E00 +0C00 +0000 +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0161 +ENCODING 353 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +6C +2C +38 +00 +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 0162 +ENCODING 354 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 19 0 -5 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0000 +0600 +0600 +0200 +0400 +ENDCHAR +STARTCHAR 0163 +ENCODING 355 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 18 0 -5 +BITMAP +20 +20 +20 +F8 +F8 +20 +20 +20 +20 +20 +20 +38 +38 +00 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 0164 +ENCODING 356 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 18 0 0 +BITMAP +1900 +0F00 +0600 +0000 +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0165 +ENCODING 357 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 14 0 0 +BITMAP +06 +26 +22 +22 +F8 +F8 +20 +20 +20 +20 +20 +20 +38 +38 +ENDCHAR +STARTCHAR 0166 +ENCODING 358 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +3FC0 +3FC0 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0167 +ENCODING 359 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +20 +60 +60 +F8 +F8 +60 +60 +F8 +F8 +60 +60 +78 +38 +ENDCHAR +STARTCHAR 0168 +ENCODING 360 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0C80 +1F80 +1300 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0169 +ENCODING 361 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +32 +7E +6E +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 016A +ENCODING 362 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 16 1 0 +BITMAP +1F80 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 016B +ENCODING 363 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 12 1 0 +BITMAP +7E +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 016C +ENCODING 364 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +1180 +0900 +0E00 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 016D +ENCODING 365 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +22 +26 +1C +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 016E +ENCODING 366 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0600 +0A00 +0900 +0A00 +C660 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 016F +ENCODING 367 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 16 1 0 +BITMAP +18 +24 +24 +24 +18 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 0170 +ENCODING 368 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0CC0 +0D80 +1900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0171 +ENCODING 369 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +36 +36 +64 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 0172 +ENCODING 370 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 -4 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +0400 +0400 +0400 +0380 +ENDCHAR +STARTCHAR 0173 +ENCODING 371 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -4 +BITMAP +C100 +C100 +C100 +C100 +C100 +C100 +C300 +C300 +7F00 +3D00 +0100 +0300 +0300 +01C0 +ENDCHAR +STARTCHAR 0174 +ENCODING 372 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 18 0 0 +BITMAP +00C000 +01E000 +033000 +000000 +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 0175 +ENCODING 373 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +0300 +0780 +0CC0 +0000 +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 0176 +ENCODING 374 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0700 +0500 +0D80 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0177 +ENCODING 375 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +18 +3C +26 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0178 +ENCODING 376 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +0980 +0980 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0179 +ENCODING 377 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 18 0 0 +BITMAP +0600 +0600 +0400 +0000 +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 017A +ENCODING 378 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0600 +0C00 +0800 +0000 +7F80 +7F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FF80 +FF80 +ENDCHAR +STARTCHAR 017B +ENCODING 379 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 17 0 0 +BITMAP +0600 +0600 +0000 +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 017C +ENCODING 380 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +0C00 +0C00 +0000 +7F80 +7F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FF80 +FF80 +ENDCHAR +STARTCHAR 017D +ENCODING 381 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 18 0 0 +BITMAP +1900 +0F00 +0600 +0000 +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 017E +ENCODING 382 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +3300 +1E00 +0C00 +0000 +7F80 +7F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FF80 +FF80 +ENDCHAR +STARTCHAR 017F +ENCODING 383 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 14 1 0 +BITMAP +78 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 018F +ENCODING 399 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6030 +6030 +0030 +FFF0 +FFF0 +C010 +C030 +6030 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0192 +ENCODING 402 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 18 0 -4 +BITMAP +03C0 +03C0 +0200 +0600 +1F80 +1F80 +0600 +0400 +0400 +0C00 +0C00 +0C00 +0800 +0800 +1800 +1800 +7800 +F000 +ENDCHAR +STARTCHAR 01A0 +ENCODING 416 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 01A1 +ENCODING 417 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 01AF +ENCODING 431 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01B0 +ENCODING 432 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 01CD +ENCODING 461 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0980 +0F00 +0600 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 01CE +ENCODING 462 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3600 +1400 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 01CF +ENCODING 463 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 18 0 0 +BITMAP +D8 +58 +70 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 01D0 +ENCODING 464 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 14 0 0 +BITMAP +98 +F0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 01D1 +ENCODING 465 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0D80 +0500 +0700 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 01D2 +ENCODING 466 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +2600 +3400 +1800 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 01D3 +ENCODING 467 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +1980 +0F00 +0600 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01D4 +ENCODING 468 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +36 +34 +1C +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01D5 +ENCODING 469 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0F00 +0000 +0900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01D6 +ENCODING 470 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 15 1 0 +BITMAP +7E +00 +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01D7 +ENCODING 471 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0300 +0600 +0900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01D8 +ENCODING 472 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 17 1 0 +BITMAP +0C +0C +18 +00 +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01D9 +ENCODING 473 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0F00 +0600 +0900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01DA +ENCODING 474 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 17 1 0 +BITMAP +36 +34 +1C +00 +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01DB +ENCODING 475 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0C00 +0600 +0900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01DC +ENCODING 476 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 17 1 0 +BITMAP +30 +18 +08 +00 +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01FA +ENCODING 506 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 20 0 0 +BITMAP +0300 +0300 +0600 +0900 +0900 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 01FB +ENCODING 507 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 20 1 0 +BITMAP +0600 +0C00 +0800 +0000 +1800 +2400 +2400 +2400 +1800 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 01FC +ENCODING 508 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 18 18 0 0 +BITMAP +006000 +006000 +00C000 +000000 +03FFC0 +03FFC0 +066000 +066000 +0C6000 +0C6000 +087F80 +187F80 +1FE000 +3FE000 +306000 +606000 +607FC0 +C07FC0 +ENDCHAR +STARTCHAR 01FD +ENCODING 509 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +00C0 +0180 +0100 +0000 +3E78 +7FFC +C386 +0F06 +7FFE +F3FE +8300 +C786 +FFFC +7878 +ENDCHAR +STARTCHAR 01FE +ENCODING 510 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 19 1 -1 +BITMAP +0300 +0300 +0200 +0000 +0F88 +3FD0 +7060 +6070 +C0D0 +C198 +C318 +C618 +CC18 +D818 +7030 +7070 +7FE0 +DF80 +8000 +ENDCHAR +STARTCHAR 01FF +ENCODING 511 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 9 15 1 -1 +BITMAP +0600 +0400 +0C00 +0080 +1E80 +7F00 +6380 +C680 +C480 +C880 +D180 +7380 +7F00 +5E00 +8000 +ENDCHAR +STARTCHAR 0259 +ENCODING 601 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +FF00 +C300 +0180 +FF80 +FF80 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 02C6 +ENCODING 710 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 3 1 11 +BITMAP +60 +F0 +98 +ENDCHAR +STARTCHAR 02C7 +ENCODING 711 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 3 1 11 +BITMAP +D8 +D0 +70 +ENDCHAR +STARTCHAR 02C9 +ENCODING 713 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 1 0 11 +BITMAP +FC +ENDCHAR +STARTCHAR 02D8 +ENCODING 728 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 11 +BITMAP +C4 +4C +38 +ENDCHAR +STARTCHAR 02D9 +ENCODING 729 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 2 2 11 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 02DA +ENCODING 730 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 5 1 9 +BITMAP +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR 02DB +ENCODING 731 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 4 2 -4 +BITMAP +80 +80 +80 +F0 +ENDCHAR +STARTCHAR 02DC +ENCODING 732 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 11 +BITMAP +64 +FC +9C +ENDCHAR +STARTCHAR 02DD +ENCODING 733 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 1 11 +BITMAP +EC +D8 +90 +ENDCHAR +STARTCHAR 0300 +ENCODING 768 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -5 15 +BITMAP +C0 +60 +20 +ENDCHAR +STARTCHAR 0301 +ENCODING 769 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -3 15 +BITMAP +60 +C0 +80 +ENDCHAR +STARTCHAR 0303 +ENCODING 771 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -8 15 +BITMAP +EC +98 +ENDCHAR +STARTCHAR 0309 +ENCODING 777 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -4 15 +BITMAP +E0 +30 +60 +ENDCHAR +STARTCHAR 0323 +ENCODING 803 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 037E +ENCODING 894 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 13 2 -3 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +40 +80 +80 +ENDCHAR +STARTCHAR 0384 +ENCODING 900 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 3 2 11 +BITMAP +60 +40 +C0 +ENDCHAR +STARTCHAR 0385 +ENCODING 901 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 7 3 0 11 +BITMAP +18 +96 +A6 +ENDCHAR +STARTCHAR 0386 +ENCODING 902 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +3600 +6700 +4F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0387 +ENCODING 903 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 2 2 8 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 0388 +ENCODING 904 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 -1 0 +BITMAP +67FE +67FE +C600 +0600 +0600 +0600 +07FC +07FC +0600 +0600 +0600 +0600 +07FE +07FE +ENDCHAR +STARTCHAR 0389 +ENCODING 905 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 -1 0 +BITMAP +6C06 +6C06 +CC06 +0C06 +0C06 +0C06 +0FFE +0FFE +0C06 +0C06 +0C06 +0C06 +0C06 +0C06 +ENDCHAR +STARTCHAR 038A +ENCODING 906 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 14 -1 0 +BITMAP +6C +6C +CC +0C +0C +0C +0C +0C +0C +0C +0C +0C +0C +0C +ENDCHAR +STARTCHAR 038C +ENCODING 908 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 -1 0 +BITMAP +63E0 +6FF8 +DC18 +180C +300C +3006 +3006 +3006 +3006 +300C +180C +1C18 +0FF8 +03E0 +ENDCHAR +STARTCHAR 038E +ENCODING 910 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 14 -1 0 +BITMAP +660180 +630300 +C30600 +018600 +018C00 +00D800 +007800 +007000 +003000 +003000 +003000 +003000 +003000 +003000 +ENDCHAR +STARTCHAR 038F +ENCODING 911 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 14 14 -1 0 +BITMAP +63E0 +6FF0 +DC38 +181C +300C +300C +300C +300C +300C +180C +0818 +0C30 +3E7C +3E7C +ENDCHAR +STARTCHAR 0390 +ENCODING 912 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 6 15 -1 0 +BITMAP +18 +94 +A4 +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 0391 +ENCODING 913 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0392 +ENCODING 914 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF00 +FF80 +C0C0 +C0C0 +C0C0 +C0C0 +FF80 +FF80 +C0C0 +C060 +C060 +C0C0 +FFC0 +FF80 +ENDCHAR +STARTCHAR 0393 +ENCODING 915 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 2 0 +BITMAP +FF +FF +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0394 +ENCODING 916 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3060 +2060 +6060 +6030 +7FF0 +FFF8 +ENDCHAR +STARTCHAR 0395 +ENCODING 917 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0396 +ENCODING 918 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0397 +ENCODING 919 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 0398 +ENCODING 920 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +CF98 +CF98 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 0399 +ENCODING 921 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 039A +ENCODING 922 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +FC00 +F600 +E700 +C300 +C180 +C0C0 +C0E0 +C060 +ENDCHAR +STARTCHAR 039B +ENCODING 923 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1880 +18C0 +10C0 +3040 +3060 +6060 +6030 +4030 +C030 +ENDCHAR +STARTCHAR 039C +ENCODING 924 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 14 1 0 +BITMAP +E018 +F038 +F028 +D028 +D868 +D868 +C848 +CCC8 +CCC8 +C488 +C788 +C788 +C308 +C308 +ENDCHAR +STARTCHAR 039D +ENCODING 925 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 039E +ENCODING 926 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FFC0 +FFC0 +0000 +0000 +0000 +0000 +7F80 +7F80 +0000 +0000 +0000 +0000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 039F +ENCODING 927 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 03A0 +ENCODING 928 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 03A1 +ENCODING 929 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF80 +FFC0 +C0E0 +C060 +C060 +C060 +C0C0 +FFC0 +FF80 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 03A3 +ENCODING 931 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FFC0 +FFC0 +6000 +3000 +1800 +0C00 +0600 +0C00 +1800 +3800 +7000 +6000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 03A4 +ENCODING 932 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 03A5 +ENCODING 933 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 03A6 +ENCODING 934 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0200 +0200 +1FC0 +7FF0 +E238 +C218 +C218 +C218 +C218 +E238 +7FF0 +1FC0 +0200 +0200 +ENDCHAR +STARTCHAR 03A7 +ENCODING 935 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +6030 +3060 +30C0 +18C0 +0D80 +0F00 +0700 +0700 +0D80 +1980 +18C0 +3060 +6070 +E030 +ENDCHAR +STARTCHAR 03A8 +ENCODING 936 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +C30C +C30C +C30C +C30C +C30C +C30C +E318 +7338 +3FF0 +1FE0 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 03A9 +ENCODING 937 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6070 +C030 +C030 +C030 +C030 +C030 +4020 +6060 +30C0 +F9F0 +F9F0 +ENDCHAR +STARTCHAR 03AA +ENCODING 938 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 17 0 0 +BITMAP +D8 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 03AB +ENCODING 939 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +0980 +0980 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 03AC +ENCODING 940 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3D80 +7F80 +C380 +C300 +C100 +C100 +C300 +C380 +7F80 +3D80 +ENDCHAR +STARTCHAR 03AD +ENCODING 941 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 14 1 0 +BITMAP +18 +18 +10 +00 +78 +7C +C4 +C0 +70 +70 +C0 +C4 +FE +78 +ENDCHAR +STARTCHAR 03AE +ENCODING 942 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 -4 +BITMAP +0C +0C +08 +00 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 03AF +ENCODING 943 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 14 1 0 +BITMAP +60 +40 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 03B0 +ENCODING 944 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +4B +53 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR 03B1 +ENCODING 945 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3D80 +7F80 +C380 +C300 +C100 +C100 +C300 +C380 +7F80 +3D80 +ENDCHAR +STARTCHAR 03B2 +ENCODING 946 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +3E00 +7F00 +6300 +C100 +C300 +DC00 +DF00 +C380 +C180 +C180 +C180 +E380 +FF00 +DE00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 03B3 +ENCODING 947 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 -4 +BITMAP +C180 +6180 +6100 +2300 +3300 +3200 +1600 +1E00 +1C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 03B4 +ENCODING 948 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +7F00 +7F00 +3000 +1800 +3E00 +7F00 +E300 +C180 +8180 +8180 +C180 +E300 +7F00 +3C00 +ENDCHAR +STARTCHAR 03B5 +ENCODING 949 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +78 +7C +C4 +C0 +70 +70 +C0 +C4 +FE +78 +ENDCHAR +STARTCHAR 03B6 +ENCODING 950 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 18 1 -4 +BITMAP +7E +7E +0C +18 +30 +60 +40 +C0 +C0 +80 +80 +C0 +FC +7E +06 +06 +0C +0C +ENDCHAR +STARTCHAR 03B7 +ENCODING 951 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 03B8 +ENCODING 952 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +6300 +C100 +C180 +C180 +FF80 +FF80 +C180 +C180 +C100 +6300 +7E00 +3C00 +ENDCHAR +STARTCHAR 03B9 +ENCODING 953 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 03BA +ENCODING 954 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C7 +CE +D8 +F0 +F0 +D8 +CC +CC +C6 +C3 +ENDCHAR +STARTCHAR 03BB +ENCODING 955 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +1000 +1800 +1800 +0800 +0C00 +1C00 +1E00 +1600 +3600 +3300 +6300 +6100 +6180 +C180 +ENDCHAR +STARTCHAR 03BC +ENCODING 956 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C1 +E3 +FF +DD +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 03BD +ENCODING 957 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +C180 +6180 +6100 +2300 +3300 +3200 +1600 +1C00 +1C00 +0C00 +ENDCHAR +STARTCHAR 03BE +ENCODING 958 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 18 1 -4 +BITMAP +3C +7C +C0 +C0 +40 +7C +1C +60 +C0 +C0 +C0 +C0 +7C +3E +06 +06 +0E +0C +ENDCHAR +STARTCHAR 03BF +ENCODING 959 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 03C0 +ENCODING 960 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 10 0 0 +BITMAP +FFF8 +FFF8 +1840 +1840 +1840 +1840 +1840 +1840 +1840 +1840 +ENDCHAR +STARTCHAR 03C1 +ENCODING 961 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +3E00 +7F00 +6380 +C180 +C180 +C180 +C180 +E380 +FF00 +DE00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 03C2 +ENCODING 962 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -4 +BITMAP +1F +3F +60 +C0 +C0 +80 +C0 +E0 +7C +3E +03 +02 +1E +1C +ENDCHAR +STARTCHAR 03C3 +ENCODING 963 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +3FC0 +7FC0 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 03C4 +ENCODING 964 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +FE +FE +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 03C5 +ENCODING 965 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR 03C6 +ENCODING 966 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 -4 +BITMAP +3780 +6FC0 +CCC0 +CC60 +8C60 +8C60 +CCC0 +EDC0 +7F80 +3F00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 03C7 +ENCODING 967 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 14 0 -4 +BITMAP +6080 +6180 +3300 +3300 +1E00 +1E00 +0C00 +0C00 +1E00 +1600 +3300 +2100 +6180 +C0C0 +ENDCHAR +STARTCHAR 03C8 +ENCODING 968 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 -4 +BITMAP +C620 +C620 +C620 +C620 +C620 +C620 +C620 +C660 +66C0 +3F80 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 03C9 +ENCODING 969 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 10 1 0 +BITMAP +6030 +4010 +C218 +C218 +C218 +C218 +C618 +C538 +7DF0 +38E0 +ENDCHAR +STARTCHAR 03CA +ENCODING 970 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 13 0 0 +BITMAP +98 +98 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 03CB +ENCODING 971 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +36 +36 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR 03CC +ENCODING 972 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 03CD +ENCODING 973 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +0C +18 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR 03CE +ENCODING 974 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0180 +0300 +0200 +0000 +6030 +4010 +C218 +C218 +C218 +C218 +C618 +C538 +7DF0 +38E0 +ENDCHAR +STARTCHAR 0401 +ENCODING 1025 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +1B00 +1B00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0402 +ENCODING 1026 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 16 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +06F8 +07FE +0706 +0603 +0603 +0603 +0646 +067E +063C +ENDCHAR +STARTCHAR 0403 +ENCODING 1027 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +FF80 +FF80 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0404 +ENCODING 1028 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6070 +C020 +C000 +FE00 +FE00 +C000 +C000 +6030 +7060 +3FE0 +0F80 +ENDCHAR +STARTCHAR 0405 +ENCODING 1029 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0406 +ENCODING 1030 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0407 +ENCODING 1031 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 17 0 0 +BITMAP +D8 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 0408 +ENCODING 1032 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 14 1 0 +BITMAP +06 +06 +06 +06 +06 +06 +06 +06 +06 +06 +86 +C6 +FC +78 +ENDCHAR +STARTCHAR 0409 +ENCODING 1033 +SWIDTH 1028 0 +DWIDTH 20 0 +BBX 19 14 0 0 +BITMAP +3FE000 +3FE000 +306000 +306000 +306000 +306000 +307F80 +307FE0 +306060 +306060 +306060 +B06060 +F07FE0 +607F80 +ENDCHAR +STARTCHAR 040A +ENCODING 1034 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 16 14 2 0 +BITMAP +8300 +8300 +8300 +8300 +8300 +8300 +FFFE +FFFF +8303 +8301 +8301 +8303 +83FF +83FE +ENDCHAR +STARTCHAR 040B +ENCODING 1035 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +06F8 +07FC +0706 +0606 +0602 +0602 +0602 +0602 +0602 +ENDCHAR +STARTCHAR 040C +ENCODING 1036 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 18 1 0 +BITMAP +0600 +0C00 +0C00 +0000 +C1C0 +C3C0 +C300 +C600 +C600 +CC00 +F800 +CC00 +C600 +C600 +C300 +C380 +C180 +C1C0 +ENDCHAR +STARTCHAR 040E +ENCODING 1038 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 18 0 0 +BITMAP +0880 +0880 +0700 +0000 +C030 +6020 +6060 +3040 +10C0 +1880 +0980 +0D00 +0700 +0600 +0600 +0600 +3C00 +3800 +ENDCHAR +STARTCHAR 040F +ENCODING 1039 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 -4 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +FFE0 +FFE0 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0410 +ENCODING 1040 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0411 +ENCODING 1041 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 2 0 +BITMAP +FF00 +FF00 +8000 +8000 +8000 +8000 +FF00 +FF80 +81C0 +80C0 +80C0 +81C0 +FF80 +FF00 +ENDCHAR +STARTCHAR 0412 +ENCODING 1042 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF00 +FF80 +C0C0 +C0C0 +C0C0 +C0C0 +FF80 +FF80 +C0C0 +C060 +C060 +C0C0 +FFC0 +FF80 +ENDCHAR +STARTCHAR 0413 +ENCODING 1043 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +FF80 +FF80 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0414 +ENCODING 1044 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 17 0 -3 +BITMAP +1FE0 +1FE0 +1060 +1060 +1060 +1060 +1060 +3060 +3060 +3060 +2060 +6060 +FFF0 +FFF0 +C010 +C010 +C010 +ENDCHAR +STARTCHAR 0415 +ENCODING 1045 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0416 +ENCODING 1046 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 17 14 0 0 +BITMAP +E0C180 +F0C380 +30C600 +18C600 +18CC00 +0CDC00 +07F000 +0CDC00 +18CC00 +18C600 +30C700 +70C300 +60C380 +E0C180 +ENDCHAR +STARTCHAR 0417 +ENCODING 1047 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +3E00 +7F00 +E380 +C180 +0180 +0380 +0F00 +0F80 +0180 +00C0 +C0C0 +E180 +7F80 +3E00 +ENDCHAR +STARTCHAR 0418 +ENCODING 1048 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +C060 +C0E0 +C0E0 +C1A0 +C3A0 +C320 +C620 +CE20 +CC20 +D820 +D820 +F020 +E020 +E020 +ENDCHAR +STARTCHAR 0419 +ENCODING 1049 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +1100 +1900 +0E00 +0000 +C060 +C0E0 +C0E0 +C1A0 +C3A0 +C320 +C620 +CE20 +CC20 +D820 +D820 +F020 +E020 +E020 +ENDCHAR +STARTCHAR 041A +ENCODING 1050 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +C1C0 +C3C0 +C300 +C600 +C600 +CC00 +F800 +CC00 +C600 +C600 +C300 +C380 +C180 +C1C0 +ENDCHAR +STARTCHAR 041B +ENCODING 1051 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +3FE0 +3FE0 +3060 +3060 +3060 +3060 +3060 +3060 +3060 +3060 +3060 +B060 +F060 +6060 +ENDCHAR +STARTCHAR 041C +ENCODING 1052 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 14 1 0 +BITMAP +E018 +F038 +F028 +D028 +D868 +D868 +C848 +CCC8 +CCC8 +C488 +C788 +C788 +C308 +C308 +ENDCHAR +STARTCHAR 041D +ENCODING 1053 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 041E +ENCODING 1054 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 041F +ENCODING 1055 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +FFE0 +FFE0 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +ENDCHAR +STARTCHAR 0420 +ENCODING 1056 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF80 +FFC0 +C0E0 +C060 +C060 +C060 +C0C0 +FFC0 +FF80 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0421 +ENCODING 1057 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 0422 +ENCODING 1058 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0423 +ENCODING 1059 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 14 0 0 +BITMAP +C030 +6020 +6060 +3040 +10C0 +1880 +0980 +0D00 +0700 +0600 +0600 +0600 +3C00 +3800 +ENDCHAR +STARTCHAR 0424 +ENCODING 1060 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 1 0 +BITMAP +0600 +0600 +1FC0 +7FE0 +E670 +C630 +C618 +C618 +C630 +E670 +7FE0 +1FC0 +0600 +0600 +ENDCHAR +STARTCHAR 0425 +ENCODING 1061 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +6030 +3060 +30C0 +18C0 +0D80 +0F00 +0700 +0700 +0D80 +1980 +18C0 +3060 +6070 +E030 +ENDCHAR +STARTCHAR 0426 +ENCODING 1062 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +FFF0 +FFF0 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR 0427 +ENCODING 1063 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 14 1 0 +BITMAP +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +E1C0 +7FC0 +3EC0 +00C0 +00C0 +00C0 +00C0 +ENDCHAR +STARTCHAR 0428 +ENCODING 1064 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +FFFE +FFFE +ENDCHAR +STARTCHAR 0429 +ENCODING 1065 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 16 18 1 -4 +BITMAP +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +FFFF +FFFF +0001 +0001 +0001 +0001 +ENDCHAR +STARTCHAR 042A +ENCODING 1066 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 14 0 0 +BITMAP +FC00 +FC00 +0C00 +0C00 +0C00 +0C00 +0FF0 +0FFC +0C0C +0C0C +0C0C +0C0C +0FFC +0FF0 +ENDCHAR +STARTCHAR 042B +ENCODING 1067 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 13 14 2 0 +BITMAP +8018 +8018 +8018 +8018 +8018 +8018 +FF18 +FF98 +81D8 +80D8 +80D8 +81D8 +FF98 +FF18 +ENDCHAR +STARTCHAR 042C +ENCODING 1068 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 2 0 +BITMAP +8000 +8000 +8000 +8000 +8000 +8000 +FF00 +FF80 +81C0 +80C0 +80C0 +8180 +FF80 +FF00 +ENDCHAR +STARTCHAR 042D +ENCODING 1069 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +1F00 +7FC0 +60C0 +C060 +4060 +0030 +07F0 +07F0 +0030 +0020 +C060 +E0E0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 042E +ENCODING 1070 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 16 14 2 0 +BITMAP +80F8 +83FC +870E +8607 +8C03 +8C03 +FC03 +FC03 +8C03 +8C03 +8607 +870E +83FC +80F8 +ENDCHAR +STARTCHAR 042F +ENCODING 1071 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +3FE0 +7FE0 +6060 +C060 +C060 +6060 +7FE0 +3FE0 +1C60 +3860 +3060 +6060 +C060 +C060 +ENDCHAR +STARTCHAR 0430 +ENCODING 1072 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 0431 +ENCODING 1073 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3F80 +7F00 +E000 +C000 +9E00 +BF00 +E380 +C180 +C180 +C180 +C180 +6380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0432 +ENCODING 1074 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +FE +FF +C3 +C3 +FE +FF +C3 +C3 +FF +FE +ENDCHAR +STARTCHAR 0433 +ENCODING 1075 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +FC +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0434 +ENCODING 1076 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 -3 +BITMAP +1F80 +1F80 +3080 +3080 +3080 +3080 +2080 +6080 +FFE0 +FFE0 +8060 +8060 +8060 +ENDCHAR +STARTCHAR 0435 +ENCODING 1077 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0436 +ENCODING 1078 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 10 0 0 +BITMAP +E630 +E670 +3660 +16C0 +0F80 +16C0 +3660 +6620 +6630 +C610 +ENDCHAR +STARTCHAR 0437 +ENCODING 1079 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +78 +FC +C6 +06 +3C +3C +06 +86 +FE +7C +ENDCHAR +STARTCHAR 0438 +ENCODING 1080 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 10 1 0 +BITMAP +C3 +C3 +C7 +CD +C9 +D9 +D1 +F1 +E1 +C1 +ENDCHAR +STARTCHAR 0439 +ENCODING 1081 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +22 +22 +1C +00 +C3 +C3 +C7 +CD +C9 +D9 +D1 +F1 +E1 +C1 +ENDCHAR +STARTCHAR 043A +ENCODING 1082 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +C6 +CE +CC +D8 +F0 +D8 +CC +CC +C6 +C6 +ENDCHAR +STARTCHAR 043B +ENCODING 1083 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +3FC0 +3FC0 +30C0 +30C0 +30C0 +30C0 +30C0 +30C0 +F0C0 +E0C0 +ENDCHAR +STARTCHAR 043C +ENCODING 1084 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +E0E0 +E0E0 +F1E0 +D1E0 +D160 +DB60 +CA60 +CA60 +CE60 +C460 +ENDCHAR +STARTCHAR 043D +ENCODING 1085 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 10 1 0 +BITMAP +C1 +C1 +C1 +C1 +FF +FF +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 043E +ENCODING 1086 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 043F +ENCODING 1087 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +FF +FF +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR 0440 +ENCODING 1088 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DC00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0441 +ENCODING 1089 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 0442 +ENCODING 1090 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +FF +FF +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 0443 +ENCODING 1091 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0444 +ENCODING 1092 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 -4 +BITMAP +0300 +0300 +0300 +0300 +3BF0 +7FF8 +C71C +C30C +830C +830C +C30C +C718 +7FF8 +3BF0 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 0445 +ENCODING 1093 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +6180 +6300 +3600 +1E00 +0C00 +1C00 +1E00 +3300 +6300 +E180 +ENDCHAR +STARTCHAR 0446 +ENCODING 1094 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +C100 +C100 +C100 +C100 +C100 +C100 +C100 +C100 +FF80 +FF80 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 0447 +ENCODING 1095 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +83 +83 +83 +83 +C3 +FF +7F +03 +03 +03 +ENDCHAR +STARTCHAR 0448 +ENCODING 1096 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 10 1 0 +BITMAP +C218 +C218 +C218 +C218 +C218 +C218 +C218 +C218 +FFF8 +FFF8 +ENDCHAR +STARTCHAR 0449 +ENCODING 1097 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 -4 +BITMAP +C218 +C218 +C218 +C218 +C218 +C218 +C218 +C218 +FFFC +FFFC +0004 +0004 +0004 +0004 +ENDCHAR +STARTCHAR 044A +ENCODING 1098 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +F800 +F800 +1800 +1800 +1FC0 +1FE0 +1860 +1860 +1FE0 +1FC0 +ENDCHAR +STARTCHAR 044B +ENCODING 1099 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 10 1 0 +BITMAP +C020 +C020 +C020 +FE20 +FF20 +C320 +C120 +C320 +FF20 +FE20 +ENDCHAR +STARTCHAR 044C +ENCODING 1100 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C0 +C0 +C0 +FE +FF +C3 +C1 +C3 +FF +FE +ENDCHAR +STARTCHAR 044D +ENCODING 1101 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7C +FE +C7 +03 +1F +1F +03 +87 +FE +7C +ENDCHAR +STARTCHAR 044E +ENCODING 1102 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 10 1 0 +BITMAP +C3C0 +C7E0 +CE30 +CC10 +FC10 +FC10 +CC10 +CE30 +C7F0 +C3C0 +ENDCHAR +STARTCHAR 044F +ENCODING 1103 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7F +FF +C3 +C3 +7F +1F +73 +63 +C3 +C3 +ENDCHAR +STARTCHAR 0451 +ENCODING 1105 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2600 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0452 +ENCODING 1106 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 0 -4 +BITMAP +6000 +FC00 +FC00 +6000 +6F00 +7F80 +7180 +6080 +6080 +6080 +6080 +6080 +6080 +6080 +0080 +0180 +0380 +0300 +ENDCHAR +STARTCHAR 0453 +ENCODING 1107 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 14 1 0 +BITMAP +18 +18 +30 +00 +FC +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0454 +ENCODING 1108 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +7F +C3 +C0 +F8 +F8 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 0455 +ENCODING 1109 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 0456 +ENCODING 1110 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0457 +ENCODING 1111 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +C8 +C8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 0458 +ENCODING 1112 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 18 -1 -4 +BITMAP +30 +30 +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0459 +ENCODING 1113 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 17 10 0 0 +BITMAP +3FC000 +3FC000 +30C000 +30FE00 +30FF00 +30C300 +30C180 +30C300 +F0FF00 +E0FE00 +ENDCHAR +STARTCHAR 045A +ENCODING 1114 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 10 1 0 +BITMAP +C200 +C200 +C200 +C200 +FFF0 +FFF8 +C20C +C20C +C3F8 +C3F0 +ENDCHAR +STARTCHAR 045B +ENCODING 1115 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 0 0 +BITMAP +6000 +FC00 +FC00 +6000 +6F00 +7F80 +7180 +6080 +6080 +6080 +6080 +6080 +6080 +6080 +ENDCHAR +STARTCHAR 045C +ENCODING 1116 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 14 1 0 +BITMAP +18 +18 +30 +00 +C6 +CE +CC +D8 +F0 +D8 +CC +CC +C6 +C6 +ENDCHAR +STARTCHAR 045E +ENCODING 1118 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +46 +64 +38 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 045F +ENCODING 1119 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +FF +FF +08 +08 +08 +08 +ENDCHAR +STARTCHAR 0490 +ENCODING 1168 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 17 1 0 +BITMAP +03 +03 +03 +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0491 +ENCODING 1169 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +04 +04 +04 +04 +FC +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0492 +ENCODING 1170 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +7FC0 +7FC0 +6000 +6000 +6000 +6000 +FE00 +FE00 +6000 +6000 +6000 +6000 +6000 +6000 +ENDCHAR +STARTCHAR 0493 +ENCODING 1171 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7E +7E +60 +F8 +F8 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 0496 +ENCODING 1174 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 17 18 0 -4 +BITMAP +E0C380 +F0C780 +38C600 +18CE00 +1CCC00 +0FF800 +07F800 +0CDC00 +18CE00 +38C600 +30C700 +70C300 +60C380 +E0C180 +000080 +000080 +000080 +000080 +ENDCHAR +STARTCHAR 0497 +ENCODING 1175 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 13 0 -3 +BITMAP +E630 +E670 +3660 +1FC0 +1FC0 +36E0 +3660 +6630 +6638 +C618 +0018 +0018 +0018 +ENDCHAR +STARTCHAR 049A +ENCODING 1178 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 18 1 -4 +BITMAP +C1C0 +C3C0 +C700 +C600 +CE00 +FC00 +FC00 +CE00 +C600 +C700 +C300 +C380 +C1C0 +C1C0 +00C0 +00C0 +00C0 +00C0 +ENDCHAR +STARTCHAR 049B +ENCODING 1179 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 13 1 -3 +BITMAP +C6 +CE +D8 +F8 +F8 +D8 +CC +CC +C6 +C6 +02 +02 +02 +ENDCHAR +STARTCHAR 049C +ENCODING 1180 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +C1C0 +C3C0 +DF00 +DE00 +DE00 +FC00 +FC00 +DC00 +DE00 +DF00 +DB00 +DB80 +C180 +C1C0 +ENDCHAR +STARTCHAR 049D +ENCODING 1181 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +C6 +DE +D8 +F8 +F8 +D8 +DC +DC +C6 +C6 +ENDCHAR +STARTCHAR 04A2 +ENCODING 1186 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 2 -4 +BITMAP +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80E0 +80E0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR 04A3 +ENCODING 1187 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +C100 +C100 +C100 +C100 +FF00 +FF00 +C100 +C100 +C180 +C180 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 04AE +ENCODING 1198 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +C0C0 +60C0 +6180 +3180 +3300 +1A00 +0E00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 04AF +ENCODING 1199 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 -4 +BITMAP +C180 +6180 +6100 +6300 +3300 +3600 +1600 +1E00 +1C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 04B0 +ENCODING 1200 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +C0C0 +60C0 +2180 +3100 +1B00 +1E00 +7FC0 +7FC0 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 04B1 +ENCODING 1201 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 -4 +BITMAP +C180 +6180 +6100 +6300 +3300 +3600 +1600 +1E00 +1C00 +0C00 +7F80 +7F80 +0C00 +0C00 +ENDCHAR +STARTCHAR 04B2 +ENCODING 1202 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 -4 +BITMAP +6030 +3060 +38C0 +18C0 +0D80 +0F00 +0700 +0700 +0D80 +1DC0 +18C0 +3060 +6078 +E038 +0018 +0018 +0018 +0018 +ENDCHAR +STARTCHAR 04B3 +ENCODING 1203 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 0 -3 +BITMAP +6180 +7300 +3600 +1E00 +0C00 +1E00 +1E00 +3300 +6380 +E180 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 04B8 +ENCODING 1208 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 14 1 0 +BITMAP +C0C0 +C0C0 +C0C0 +CCC0 +CCC0 +CCC0 +EDC0 +7FC0 +3EC0 +0CC0 +0CC0 +0CC0 +00C0 +00C0 +ENDCHAR +STARTCHAR 04B9 +ENCODING 1209 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +83 +83 +93 +D3 +FF +7F +13 +13 +03 +03 +ENDCHAR +STARTCHAR 04BA +ENCODING 1210 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +DF80 +FFC0 +E0E0 +C060 +C060 +C060 +C060 +C060 +C060 +ENDCHAR +STARTCHAR 04BB +ENCODING 1211 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 04D8 +ENCODING 1240 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6030 +6030 +0030 +FFF0 +FFF0 +C010 +C030 +6030 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 04D9 +ENCODING 1241 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +FF00 +C300 +0180 +FF80 +FF80 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 04E8 +ENCODING 1256 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +FFF8 +FFF8 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 04E9 +ENCODING 1257 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +C300 +C180 +FF80 +FF80 +8180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 05B0 +ENCODING 1456 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 3 2 -4 +BITMAP +C0 +00 +C0 +ENDCHAR +STARTCHAR 05B1 +ENCODING 1457 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 -4 +BITMAP +FC +00 +6C +ENDCHAR +STARTCHAR 05B2 +ENCODING 1458 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 -4 +BITMAP +FC +00 +0C +ENDCHAR +STARTCHAR 05B3 +ENCODING 1459 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 -4 +BITMAP +FC +60 +0C +ENDCHAR +STARTCHAR 05B4 +ENCODING 1460 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 2 -3 +BITMAP +C0 +ENDCHAR +STARTCHAR 05B5 +ENCODING 1461 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 1 1 -3 +BITMAP +D0 +ENDCHAR +STARTCHAR 05B6 +ENCODING 1462 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 3 1 -4 +BITMAP +D0 +00 +60 +ENDCHAR +STARTCHAR 05B7 +ENCODING 1463 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 1 1 -3 +BITMAP +F0 +ENDCHAR +STARTCHAR 05B8 +ENCODING 1464 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 3 1 -4 +BITMAP +F0 +20 +20 +ENDCHAR +STARTCHAR 05B9 +ENCODING 1465 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 2 11 +BITMAP +C0 +ENDCHAR +STARTCHAR 05BA +ENCODING 1466 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 2 11 +BITMAP +C0 +ENDCHAR +STARTCHAR 05BB +ENCODING 1467 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 -4 +BITMAP +C0 +30 +04 +ENDCHAR +STARTCHAR 05BC +ENCODING 1468 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 2 5 +BITMAP +C0 +ENDCHAR +STARTCHAR 05BD +ENCODING 1469 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 1 3 3 -4 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR 05BE +ENCODING 1470 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 2 1 8 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR 05BF +ENCODING 1471 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 1 1 12 +BITMAP +F0 +ENDCHAR +STARTCHAR 05C0 +ENCODING 1472 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 1 12 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 05C1 +ENCODING 1473 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 7 12 +BITMAP +C0 +ENDCHAR +STARTCHAR 05C2 +ENCODING 1474 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 1 1 -2 12 +BITMAP +80 +ENDCHAR +STARTCHAR 05C3 +ENCODING 1475 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 10 2 0 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR 05D0 +ENCODING 1488 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +E180 +6100 +3300 +3B00 +7F00 +4E00 +C600 +C600 +C300 +C180 +ENDCHAR +STARTCHAR 05D1 +ENCODING 1489 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 10 0 0 +BITMAP +7C00 +7E00 +0700 +0300 +0100 +0100 +0100 +0100 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 05D2 +ENCODING 1490 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +78 +7C +0C +0C +0C +1C +3C +64 +66 +C6 +ENDCHAR +STARTCHAR 05D3 +ENCODING 1491 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +FF80 +FF80 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 05D4 +ENCODING 1492 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +FE00 +7F00 +0380 +0180 +C180 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR 05D5 +ENCODING 1493 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 05D6 +ENCODING 1494 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +FC +FC +30 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 05D7 +ENCODING 1495 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +FE00 +FF00 +C380 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR 05D8 +ENCODING 1496 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +C700 +CF80 +C980 +C180 +C180 +C180 +C180 +6380 +7F00 +1E00 +ENDCHAR +STARTCHAR 05D9 +ENCODING 1497 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 5 1 5 +BITMAP +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 05DA +ENCODING 1498 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 -4 +BITMAP +FC +FE +07 +03 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 05DB +ENCODING 1499 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +F0 +FC +0C +06 +06 +06 +06 +0C +FC +F0 +ENDCHAR +STARTCHAR 05DC +ENCODING 1500 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +80 +80 +80 +80 +FE +FE +06 +06 +04 +0C +18 +18 +18 +18 +ENDCHAR +STARTCHAR 05DD +ENCODING 1501 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +FE00 +FF00 +C380 +C180 +C180 +C180 +C180 +C180 +FF80 +FF80 +ENDCHAR +STARTCHAR 05DE +ENCODING 1502 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +CE00 +DF00 +7180 +6180 +6180 +6180 +4180 +4180 +CF80 +CF80 +ENDCHAR +STARTCHAR 05DF +ENCODING 1503 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 1 -4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 05E0 +ENCODING 1504 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +E0 +F0 +30 +10 +10 +10 +10 +10 +F0 +F0 +ENDCHAR +STARTCHAR 05E1 +ENCODING 1505 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +E380 +C180 +C180 +C180 +C180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR 05E2 +ENCODING 1506 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 11 0 -1 +BITMAP +6180 +2180 +3180 +3180 +3180 +3180 +1300 +1700 +1E00 +FC00 +E000 +ENDCHAR +STARTCHAR 05E3 +ENCODING 1507 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +FC +FF +C3 +C3 +C1 +C1 +71 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 05E4 +ENCODING 1508 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 1 0 +BITMAP +FC00 +FE00 +C700 +C300 +C180 +7180 +0300 +8700 +FE00 +7C00 +ENDCHAR +STARTCHAR 05E5 +ENCODING 1509 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 0 -4 +BITMAP +C3 +63 +23 +33 +16 +1C +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 05E6 +ENCODING 1510 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +C3 +63 +33 +33 +1E +0C +04 +06 +7F +7F +ENDCHAR +STARTCHAR 05E7 +ENCODING 1511 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +FF +FF +01 +01 +43 +43 +46 +44 +44 +44 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 05E8 +ENCODING 1512 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 0 0 +BITMAP +FC +FE +07 +03 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 05E9 +ENCODING 1513 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +C460 +C460 +C460 +CC60 +CC60 +F860 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR 05EA +ENCODING 1514 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +7F80 +7FC0 +18E0 +1860 +1860 +1860 +1860 +1860 +7860 +F060 +ENDCHAR +STARTCHAR 05F0 +ENCODING 1520 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR 05F1 +ENCODING 1521 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +06 +06 +ENDCHAR +STARTCHAR 05F2 +ENCODING 1522 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 5 1 5 +BITMAP +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR 05F3 +ENCODING 1523 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 4 1 6 +BITMAP +40 +C0 +C0 +80 +ENDCHAR +STARTCHAR 05F4 +ENCODING 1524 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 4 1 6 +BITMAP +4C +C8 +C8 +98 +ENDCHAR +STARTCHAR 060C +ENCODING 1548 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 6 2 3 +BITMAP +40 +80 +80 +C0 +E0 +C0 +ENDCHAR +STARTCHAR 061B +ENCODING 1563 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 9 1 3 +BITMAP +20 +40 +80 +E0 +60 +60 +00 +60 +60 +ENDCHAR +STARTCHAR 061F +ENCODING 1567 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 11 1 3 +BITMAP +70 +C8 +98 +D8 +C0 +60 +20 +20 +00 +60 +60 +ENDCHAR +STARTCHAR 0621 +ENCODING 1569 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 8 1 1 +BITMAP +30 +70 +40 +CC +FC +70 +60 +40 +ENDCHAR +STARTCHAR 0622 +ENCODING 1570 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 14 0 2 +BITMAP +F0 +00 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0623 +ENCODING 1571 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 2 +BITMAP +40 +80 +C0 +80 +00 +00 +80 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 0624 +ENCODING 1572 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +10 +0C +10 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 0625 +ENCODING 1573 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 16 0 -2 +BITMAP +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +60 +80 +60 +80 +ENDCHAR +STARTCHAR 0626 +ENCODING 1574 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 12 0 -1 +BITMAP +2000 +4000 +6060 +40F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0627 +ENCODING 1575 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 11 1 3 +BITMAP +80 +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 0628 +ENCODING 1576 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 0 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 0629 +ENCODING 1577 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 11 0 3 +BITMAP +10 +D0 +C0 +00 +20 +30 +78 +48 +48 +78 +70 +ENDCHAR +STARTCHAR 062A +ENCODING 1578 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 3 +BITMAP +0300 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 062B +ENCODING 1579 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 10 1 3 +BITMAP +0400 +0700 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 062C +ENCODING 1580 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8600 +8600 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 062D +ENCODING 1581 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 062E +ENCODING 1582 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0400 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 062F +ENCODING 1583 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 8 1 3 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 0630 +ENCODING 1584 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +40 +60 +00 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 0631 +ENCODING 1585 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 1 -2 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0632 +ENCODING 1586 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -2 +BITMAP +04 +04 +00 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0633 +ENCODING 1587 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 9 1 -1 +BITMAP +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR 0634 +ENCODING 1588 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 -1 +BITMAP +0030 +0038 +0028 +0020 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR 0635 +ENCODING 1589 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 9 1 -1 +BITMAP +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR 0636 +ENCODING 1590 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 12 1 -1 +BITMAP +000800 +000800 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR 0637 +ENCODING 1591 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 0638 +ENCODING 1592 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 0639 +ENCODING 1593 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 0 -4 +BITMAP +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR 063A +ENCODING 1594 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 20 0 -4 +BITMAP +1000 +1000 +0000 +0000 +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR 0640 +ENCODING 1600 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 2 -1 3 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR 0641 +ENCODING 1601 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 10 0 3 +BITMAP +0018 +0018 +0000 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR 0642 +ENCODING 1602 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -1 +BITMAP +0100 +0580 +0400 +0000 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR 0643 +ENCODING 1603 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 12 0 3 +BITMAP +0040 +0060 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR 0644 +ENCODING 1604 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 0 +BITMAP +0200 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR 0645 +ENCODING 1605 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 11 0 -4 +BITMAP +38 +3C +0C +3C +7C +C0 +80 +80 +40 +40 +40 +ENDCHAR +STARTCHAR 0646 +ENCODING 1606 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 -1 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR 0647 +ENCODING 1607 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 7 1 3 +BITMAP +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR 0648 +ENCODING 1608 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 0649 +ENCODING 1609 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 064A +ENCODING 1610 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0300 +0B00 +0800 +ENDCHAR +STARTCHAR 064B +ENCODING 1611 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 4 1 12 +BITMAP +60 +80 +60 +80 +ENDCHAR +STARTCHAR 064C +ENCODING 1612 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 3 5 1 12 +BITMAP +20 +60 +A0 +E0 +C0 +ENDCHAR +STARTCHAR 064D +ENCODING 1613 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 4 1 -3 +BITMAP +60 +80 +60 +80 +ENDCHAR +STARTCHAR 064E +ENCODING 1614 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 2 1 12 +BITMAP +60 +80 +ENDCHAR +STARTCHAR 064F +ENCODING 1615 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 5 1 12 +BITMAP +60 +60 +60 +60 +80 +ENDCHAR +STARTCHAR 0650 +ENCODING 1616 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 2 1 0 +BITMAP +60 +80 +ENDCHAR +STARTCHAR 0651 +ENCODING 1617 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 3 1 12 +BITMAP +40 +60 +80 +ENDCHAR +STARTCHAR 0652 +ENCODING 1618 +SWIDTH 154 0 +DWIDTH 3 0 +BBX 2 3 1 12 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0653 +ENCODING 1619 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 2 0 13 +BITMAP +C0 +70 +ENDCHAR +STARTCHAR 0654 +ENCODING 1620 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 4 1 13 +BITMAP +40 +80 +C0 +80 +ENDCHAR +STARTCHAR 0655 +ENCODING 1621 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 4 1 -3 +BITMAP +40 +80 +C0 +80 +ENDCHAR +STARTCHAR 0660 +ENCODING 1632 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 3 4 4 4 +BITMAP +80 +E0 +C0 +40 +ENDCHAR +STARTCHAR 0661 +ENCODING 1633 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 3 10 3 3 +BITMAP +80 +C0 +C0 +60 +60 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0662 +ENCODING 1634 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 5 11 2 3 +BITMAP +80 +C8 +F8 +78 +60 +20 +30 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 0663 +ENCODING 1635 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 4 +BITMAP +CD +7F +76 +20 +20 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 0664 +ENCODING 1636 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 4 11 3 3 +BITMAP +10 +20 +40 +80 +F0 +60 +40 +40 +C0 +F0 +70 +ENDCHAR +STARTCHAR 0665 +ENCODING 1637 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 8 2 5 +BITMAP +30 +78 +9C +84 +84 +84 +F8 +F0 +ENDCHAR +STARTCHAR 0666 +ENCODING 1638 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 11 2 3 +BITMAP +80 +F0 +F0 +10 +10 +10 +10 +18 +08 +0C +04 +ENDCHAR +STARTCHAR 0667 +ENCODING 1639 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 3 +BITMAP +81 +C1 +C3 +62 +24 +24 +18 +18 +18 +08 +ENDCHAR +STARTCHAR 0668 +ENCODING 1640 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 4 +BITMAP +10 +18 +28 +28 +24 +26 +46 +C3 +81 +81 +ENDCHAR +STARTCHAR 0669 +ENCODING 1641 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 11 2 3 +BITMAP +30 +70 +98 +88 +F8 +78 +08 +08 +08 +0C +08 +ENDCHAR +STARTCHAR 066A +ENCODING 1642 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 13 1 2 +BITMAP +63 +62 +06 +04 +0C +08 +18 +10 +30 +20 +60 +46 +C6 +ENDCHAR +STARTCHAR 066B +ENCODING 1643 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 5 2 1 +BITMAP +C0 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR 066C +ENCODING 1644 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 6 2 3 +BITMAP +40 +80 +80 +C0 +E0 +C0 +ENDCHAR +STARTCHAR 066D +ENCODING 1645 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 7 2 7 +BITMAP +20 +E8 +50 +FC +70 +E8 +20 +ENDCHAR +STARTCHAR 066E +ENCODING 1646 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 6 1 3 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 066F +ENCODING 1647 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 9 1 -1 +BITMAP +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR 0670 +ENCODING 1648 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 4 0 11 +BITMAP +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0671 +ENCODING 1649 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 15 0 2 +BITMAP +30 +F0 +80 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0672 +ENCODING 1650 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 15 0 2 +BITMAP +20 +40 +E0 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0673 +ENCODING 1651 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 15 0 -1 +BITMAP +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +20 +40 +E0 +ENDCHAR +STARTCHAR 0674 +ENCODING 1652 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 4 1 13 +BITMAP +40 +80 +C0 +80 +ENDCHAR +STARTCHAR 0675 +ENCODING 1653 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 12 1 2 +BITMAP +10 +A0 +D0 +60 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 0676 +ENCODING 1654 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 9 16 0 -2 +BITMAP +0080 +0100 +0080 +0100 +0000 +0300 +0700 +0500 +0500 +0700 +0300 +0100 +0100 +0200 +8600 +7C00 +ENDCHAR +STARTCHAR 0677 +ENCODING 1655 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 9 16 0 -2 +BITMAP +0C80 +0D00 +0C80 +0D00 +1000 +0300 +0700 +0500 +0500 +0700 +0300 +0100 +0100 +0200 +8600 +7C00 +ENDCHAR +STARTCHAR 0678 +ENCODING 1656 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 15 0 -1 +BITMAP +0010 +0020 +0010 +0020 +0000 +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0679 +ENCODING 1657 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 13 1 3 +BITMAP +0400 +0800 +0400 +0780 +0480 +1F80 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 067A +ENCODING 1658 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0400 +0400 +0600 +0200 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 067B +ENCODING 1659 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0200 +0200 +0200 +0200 +ENDCHAR +STARTCHAR 067C +ENCODING 1660 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 1 +BITMAP +0300 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0500 +0600 +ENDCHAR +STARTCHAR 067D +ENCODING 1661 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0300 +0F00 +0E00 +0200 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 067E +ENCODING 1662 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0100 +0500 +0700 +0300 +ENDCHAR +STARTCHAR 067F +ENCODING 1663 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0200 +0A00 +0900 +0D00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 0680 +ENCODING 1664 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 12 1 -3 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0300 +0D00 +0D00 +0500 +0400 +ENDCHAR +STARTCHAR 0681 +ENCODING 1665 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 0 -4 +BITMAP +0600 +0800 +0600 +0800 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0682 +ENCODING 1666 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 0 -4 +BITMAP +0C00 +0C00 +0400 +0400 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0683 +ENCODING 1667 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8300 +8B00 +8800 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0684 +ENCODING 1668 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8400 +8400 +8600 +4600 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0685 +ENCODING 1669 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 0 -4 +BITMAP +0800 +0A00 +0A00 +0800 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0686 +ENCODING 1670 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4200 +8B00 +8A00 +8200 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0687 +ENCODING 1671 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4300 +8B00 +8D00 +8500 +4400 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0688 +ENCODING 1672 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 15 0 3 +BITMAP +20 +20 +20 +2C +34 +FC +00 +10 +18 +0C +04 +04 +04 +7C +7C +ENDCHAR +STARTCHAR 0689 +ENCODING 1673 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 10 1 1 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +50 +30 +ENDCHAR +STARTCHAR 068A +ENCODING 1674 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 11 1 0 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +00 +20 +30 +ENDCHAR +STARTCHAR 068B +ENCODING 1675 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 18 0 0 +BITMAP +20 +20 +20 +2C +34 +FC +00 +10 +18 +0C +04 +04 +04 +7C +7C +00 +10 +18 +ENDCHAR +STARTCHAR 068C +ENCODING 1676 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +30 +D0 +C0 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 068D +ENCODING 1677 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 -1 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +00 +10 +50 +40 +ENDCHAR +STARTCHAR 068E +ENCODING 1678 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 13 1 3 +BITMAP +40 +50 +50 +40 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 068F +ENCODING 1679 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 13 1 3 +BITMAP +20 +A0 +A0 +20 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 0690 +ENCODING 1680 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 14 1 3 +BITMAP +30 +B0 +90 +50 +40 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 0691 +ENCODING 1681 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 17 1 -2 +BITMAP +08 +10 +08 +0F +09 +3F +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0692 +ENCODING 1682 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 13 1 -2 +BITMAP +0A +04 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0693 +ENCODING 1683 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8F +7D +03 +ENDCHAR +STARTCHAR 0694 +ENCODING 1684 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +79 +01 +ENDCHAR +STARTCHAR 0695 +ENCODING 1685 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 12 1 -4 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +05 +02 +ENDCHAR +STARTCHAR 0696 +ENCODING 1686 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +02 +03 +01 +01 +11 +11 +01 +03 +8E +79 +01 +ENDCHAR +STARTCHAR 0697 +ENCODING 1687 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -2 +BITMAP +06 +1E +18 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0698 +ENCODING 1688 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 15 1 -2 +BITMAP +0C +0F +0B +08 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0699 +ENCODING 1689 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 16 1 -2 +BITMAP +04 +14 +16 +1A +18 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 069A +ENCODING 1690 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 12 1 -1 +BITMAP +0020 +0030 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8188 +FF08 +7C00 +ENDCHAR +STARTCHAR 069B +ENCODING 1691 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 10 1 -2 +BITMAP +0104 +0182 +0092 +80FE +80FE +8080 +8184 +FF14 +7C14 +0004 +ENDCHAR +STARTCHAR 069C +ENCODING 1692 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 15 1 -2 +BITMAP +0060 +0070 +0050 +0040 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8184 +FF14 +7C14 +0004 +ENDCHAR +STARTCHAR 069D +ENCODING 1693 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 9 1 -1 +BITMAP +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810100 +FF0500 +7C0400 +ENDCHAR +STARTCHAR 069E +ENCODING 1694 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 14 1 -1 +BITMAP +000400 +000500 +000500 +000400 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR 069F +ENCODING 1695 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1880 +18E0 +09E0 +0980 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 06A0 +ENCODING 1696 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 21 0 -4 +BITMAP +2000 +2800 +2800 +2000 +0000 +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR 06A1 +ENCODING 1697 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 6 0 3 +BITMAP +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR 06A2 +ENCODING 1698 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 9 0 0 +BITMAP +400C +800E +801A +C00E +7FFE +3FFE +0000 +0004 +0004 +ENDCHAR +STARTCHAR 06A3 +ENCODING 1699 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 12 0 0 +BITMAP +0008 +0008 +0000 +400C +800E +801A +C00E +7FFE +3FFE +0000 +0180 +0080 +ENDCHAR +STARTCHAR 06A4 +ENCODING 1700 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0010 +001C +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR 06A5 +ENCODING 1701 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 -2 +BITMAP +400C +800E +801A +C00E +7FFE +3FFE +0000 +0002 +000A +000A +0002 +ENDCHAR +STARTCHAR 06A6 +ENCODING 1702 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 12 0 3 +BITMAP +0004 +0014 +0014 +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR 06A7 +ENCODING 1703 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 13 1 -1 +BITMAP +0300 +0300 +0000 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR 06A8 +ENCODING 1704 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -1 +BITMAP +0400 +0700 +0500 +0400 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR 06A9 +ENCODING 1705 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0006 +001E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06AA +ENCODING 1706 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 10 0 3 +BITMAP +0080 +0380 +0E00 +1000 +1F00 +8FF8 +80FE +C002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06AB +ENCODING 1707 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0006 +001E +007A +004C +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06AC +ENCODING 1708 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 12 0 3 +BITMAP +0640 +0660 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR 06AD +ENCODING 1709 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 3 +BITMAP +0C00 +0E40 +0B60 +0860 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR 06AE +ENCODING 1710 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 17 0 -2 +BITMAP +0040 +0060 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +0000 +0300 +0F00 +0E00 +0200 +ENDCHAR +STARTCHAR 06AF +ENCODING 1711 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06B0 +ENCODING 1712 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0002 +000E +0038 +0066 +009E +007A +004C +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06B1 +ENCODING 1713 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0012 +004E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06B2 +ENCODING 1714 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 18 0 -1 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +0000 +0040 +0140 +0100 +ENDCHAR +STARTCHAR 06B3 +ENCODING 1715 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 19 0 -2 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +0000 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 06B4 +ENCODING 1716 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0042 +001E +0078 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06B5 +ENCODING 1717 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 17 1 0 +BITMAP +0500 +0200 +0000 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR 06B6 +ENCODING 1718 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 17 1 0 +BITMAP +0300 +0300 +0000 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR 06B7 +ENCODING 1719 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 17 1 0 +BITMAP +0600 +0100 +0400 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR 06B8 +ENCODING 1720 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 19 1 -4 +BITMAP +0200 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +0400 +2C00 +3C00 +0C00 +ENDCHAR +STARTCHAR 06B9 +ENCODING 1721 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 -4 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +0000 +0800 +0800 +ENDCHAR +STARTCHAR 06BA +ENCODING 1722 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR 06BB +ENCODING 1723 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 1 -1 +BITMAP +1000 +1000 +1000 +1600 +1A00 +3E00 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR 06BC +ENCODING 1724 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 1 -3 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +2800 +1800 +ENDCHAR +STARTCHAR 06BD +ENCODING 1725 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 1 -1 +BITMAP +1000 +1400 +3400 +1000 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR 06BE +ENCODING 1726 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 8 -1 3 +BITMAP +08 +1C +1C +26 +27 +19 +FF +E7 +ENDCHAR +STARTCHAR 06BF +ENCODING 1727 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0400 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4200 +8B00 +8A00 +8200 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 06C0 +ENCODING 1728 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 12 1 3 +BITMAP +60 +80 +60 +80 +00 +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR 06C1 +ENCODING 1729 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +18 +3C +6E +46 +80 +ENDCHAR +STARTCHAR 06C2 +ENCODING 1730 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 10 0 2 +BITMAP +10 +20 +10 +20 +00 +18 +3C +6E +46 +80 +ENDCHAR +STARTCHAR 06C3 +ENCODING 1731 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 9 0 2 +BITMAP +08 +28 +20 +00 +18 +3C +6E +46 +80 +ENDCHAR +STARTCHAR 06C4 +ENCODING 1732 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +01 +0D +16 +8E +7C +ENDCHAR +STARTCHAR 06C5 +ENCODING 1733 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +19 +07 +02 +86 +7C +ENDCHAR +STARTCHAR 06C6 +ENCODING 1734 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +05 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06C7 +ENCODING 1735 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -2 +BITMAP +03 +03 +03 +03 +04 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06C8 +ENCODING 1736 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -1 +BITMAP +02 +02 +02 +02 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06C9 +ENCODING 1737 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +02 +05 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06CA +ENCODING 1738 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 15 0 -2 +BITMAP +03 +0F +0C +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06CB +ENCODING 1739 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +04 +07 +0D +0C +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06CC +ENCODING 1740 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 06CD +ENCODING 1741 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 13 10 -1 -1 +BITMAP +0030 +0078 +0080 +2100 +E1F0 +40F0 +4010 +60E0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 06CE +ENCODING 1742 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 11 0 -1 +BITMAP +0C00 +0860 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 06CF +ENCODING 1743 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +04 +04 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06D0 +ENCODING 1744 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0000 +0400 +0400 +ENDCHAR +STARTCHAR 06D1 +ENCODING 1745 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0000 +0A00 +0600 +ENDCHAR +STARTCHAR 06D2 +ENCODING 1746 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 7 1 0 +BITMAP +0600 +0E00 +3800 +7000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR 06D3 +ENCODING 1747 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 10 1 0 +BITMAP +0800 +3000 +1800 +2600 +0E00 +3800 +7000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR 06D4 +ENCODING 1748 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 2 0 3 +BITMAP +F0 +F0 +ENDCHAR +STARTCHAR 06D5 +ENCODING 1749 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 7 1 3 +BITMAP +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR 06D6 +ENCODING 1750 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 7 -4 10 +BITMAP +20 +20 +20 +23 +7F +80 +FE +ENDCHAR +STARTCHAR 06D7 +ENCODING 1751 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 7 -3 10 +BITMAP +28 +30 +38 +24 +7C +80 +FE +ENDCHAR +STARTCHAR 06D8 +ENCODING 1752 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -2 10 +BITMAP +20 +50 +F0 +ENDCHAR +STARTCHAR 06D9 +ENCODING 1753 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 6 -2 10 +BITMAP +90 +D0 +50 +20 +60 +60 +ENDCHAR +STARTCHAR 06DA +ENCODING 1754 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 5 -2 10 +BITMAP +F0 +80 +A0 +80 +F0 +ENDCHAR +STARTCHAR 06DB +ENCODING 1755 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -1 10 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR 06DC +ENCODING 1756 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 5 -4 10 +BITMAP +08 +09 +87 +88 +70 +ENDCHAR +STARTCHAR 06DD +ENCODING 1757 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 21 21 0 -4 +BITMAP +00FC00 +0F0380 +13FE80 +1C01C0 +100060 +200020 +400010 +400010 +400008 +400008 +800008 +400008 +400008 +400010 +400010 +200020 +100060 +1C01C0 +13FE80 +0F0380 +00FC00 +ENDCHAR +STARTCHAR 06DE +ENCODING 1758 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 21 0 -4 +BITMAP +002000 +005000 +008800 +1FFF80 +120480 +140280 +180180 +100080 +307040 +5090A0 +909090 +5090A0 +307040 +100080 +180180 +140280 +120480 +1FFF80 +008800 +005000 +002000 +ENDCHAR +STARTCHAR 06DF +ENCODING 1759 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 1 -1 10 +BITMAP +C0 +ENDCHAR +STARTCHAR 06E0 +ENCODING 1760 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 1 -1 10 +BITMAP +C0 +ENDCHAR +STARTCHAR 06E1 +ENCODING 1761 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 3 -3 10 +BITMAP +30 +18 +FC +ENDCHAR +STARTCHAR 06E2 +ENCODING 1762 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 5 -1 10 +BITMAP +40 +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR 06E3 +ENCODING 1763 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 5 -4 -4 +BITMAP +08 +09 +87 +88 +70 +ENDCHAR +STARTCHAR 06E4 +ENCODING 1764 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 1 -1 10 +BITMAP +C0 +ENDCHAR +STARTCHAR 06E5 +ENCODING 1765 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 4 1 10 +BITMAP +60 +60 +40 +C0 +ENDCHAR +STARTCHAR 06E6 +ENCODING 1766 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 4 0 10 +BITMAP +10 +70 +80 +FE +ENDCHAR +STARTCHAR 06E7 +ENCODING 1767 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 4 -4 10 +BITMAP +10 +20 +C0 +FE +ENDCHAR +STARTCHAR 06E8 +ENCODING 1768 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 6 -2 10 +BITMAP +20 +00 +10 +90 +90 +F0 +ENDCHAR +STARTCHAR 06E9 +ENCODING 1769 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 16 1 0 +BITMAP +0800 +1400 +2A00 +5580 +AA40 +D780 +7700 +5300 +5300 +5300 +5300 +5F00 +6300 +9E80 +8080 +FFC0 +ENDCHAR +STARTCHAR 06EA +ENCODING 1770 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -2 -3 +BITMAP +60 +90 +60 +ENDCHAR +STARTCHAR 06EB +ENCODING 1771 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -2 10 +BITMAP +60 +90 +60 +ENDCHAR +STARTCHAR 06EC +ENCODING 1772 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 1 -1 10 +BITMAP +C0 +ENDCHAR +STARTCHAR 06ED +ENCODING 1773 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 5 -1 -4 +BITMAP +40 +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR 06F0 +ENCODING 1776 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 3 4 4 4 +BITMAP +80 +E0 +C0 +40 +ENDCHAR +STARTCHAR 06F1 +ENCODING 1777 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 3 10 3 3 +BITMAP +80 +C0 +C0 +60 +60 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 06F2 +ENCODING 1778 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 5 11 2 3 +BITMAP +80 +C8 +F8 +78 +60 +20 +30 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 06F3 +ENCODING 1779 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 4 +BITMAP +CD +7F +76 +20 +20 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 06F4 +ENCODING 1780 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 10 2 3 +BITMAP +1C +A0 +E2 +FC +78 +60 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 06F5 +ENCODING 1781 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 11 1 3 +BITMAP +10 +18 +1C +1C +26 +42 +42 +42 +CA +FE +7C +ENDCHAR +STARTCHAR 06F6 +ENCODING 1782 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 11 2 3 +BITMAP +30 +78 +80 +84 +FC +F8 +30 +20 +40 +40 +40 +ENDCHAR +STARTCHAR 06F7 +ENCODING 1783 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 3 +BITMAP +81 +C1 +C3 +62 +24 +24 +18 +18 +18 +08 +ENDCHAR +STARTCHAR 06F8 +ENCODING 1784 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 4 +BITMAP +10 +18 +28 +28 +24 +26 +46 +C3 +81 +81 +ENDCHAR +STARTCHAR 06F9 +ENCODING 1785 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 11 2 3 +BITMAP +30 +70 +98 +88 +F8 +78 +08 +08 +08 +0C +08 +ENDCHAR +STARTCHAR 06FA +ENCODING 1786 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 -1 +BITMAP +0060 +0070 +0050 +0040 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8188 +FF08 +7C00 +ENDCHAR +STARTCHAR 06FB +ENCODING 1787 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 12 1 -1 +BITMAP +000800 +000800 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810200 +FF0200 +7C0000 +ENDCHAR +STARTCHAR 06FC +ENCODING 1788 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 20 0 -4 +BITMAP +1000 +1000 +0000 +0000 +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8200 +8200 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR 06FD +ENCODING 1789 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +30 +70 +40 +CC +FC +70 +60 +40 +28 +28 +28 +28 +ENDCHAR +STARTCHAR 06FE +ENCODING 1790 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 11 0 -4 +BITMAP +38 +3C +0C +3C +7C +C0 +80 +94 +54 +54 +54 +ENDCHAR +STARTCHAR 1E80 +ENCODING 7808 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 18 0 0 +BITMAP +018000 +00C000 +004000 +000000 +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 1E81 +ENCODING 7809 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +0600 +0600 +0200 +0000 +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 1E82 +ENCODING 7810 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 18 0 0 +BITMAP +006000 +004000 +00C000 +000000 +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 1E83 +ENCODING 7811 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +0300 +0300 +0200 +0000 +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 1E84 +ENCODING 7812 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 17 0 0 +BITMAP +033000 +033000 +000000 +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 1E85 +ENCODING 7813 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 13 0 0 +BITMAP +0CC0 +0CC0 +0000 +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 1EA0 +ENCODING 7840 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 17 0 -3 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EA1 +ENCODING 7841 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EA2 +ENCODING 7842 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0F00 +0100 +0300 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EA3 +ENCODING 7843 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EA4 +ENCODING 7844 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0300 +0200 +0700 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EA5 +ENCODING 7845 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EA6 +ENCODING 7846 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0C00 +0600 +0700 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EA7 +ENCODING 7847 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1000 +1800 +0000 +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EA8 +ENCODING 7848 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0700 +0300 +0700 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EA9 +ENCODING 7849 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3C00 +0400 +0C00 +0000 +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EAA +ENCODING 7850 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0C80 +1380 +0700 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EAB +ENCODING 7851 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3200 +4E00 +0000 +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EAC +ENCODING 7852 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 20 0 -3 +BITMAP +0700 +0900 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EAD +ENCODING 7853 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EAE +ENCODING 7854 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0300 +0200 +0880 +0700 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EAF +ENCODING 7855 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +1800 +0000 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EB0 +ENCODING 7856 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0C00 +0600 +0880 +0700 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EB1 +ENCODING 7857 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1800 +0800 +0000 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EB2 +ENCODING 7858 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0700 +0300 +0880 +0700 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EB3 +ENCODING 7859 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EB4 +ENCODING 7860 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0E80 +1380 +0880 +0700 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EB5 +ENCODING 7861 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3B00 +2600 +0000 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EB6 +ENCODING 7862 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 20 0 -3 +BITMAP +0880 +0700 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EB7 +ENCODING 7863 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EB8 +ENCODING 7864 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 17 1 -3 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EB9 +ENCODING 7865 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EBA +ENCODING 7866 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +0300 +0600 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EBB +ENCODING 7867 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EBC +ENCODING 7868 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1C80 +1F80 +1300 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EBD +ENCODING 7869 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3A00 +3E00 +6E00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EBE +ENCODING 7870 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0600 +0400 +0E00 +1B00 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EBF +ENCODING 7871 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EC0 +ENCODING 7872 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0800 +0400 +0E00 +1B00 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EC1 +ENCODING 7873 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1000 +1800 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EC2 +ENCODING 7874 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +0600 +0E00 +1B00 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EC3 +ENCODING 7875 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3C00 +0400 +0C00 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EC4 +ENCODING 7876 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1D00 +2700 +0E00 +1B00 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EC5 +ENCODING 7877 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3200 +4E00 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EC6 +ENCODING 7878 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 20 1 -3 +BITMAP +0E00 +1B00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EC7 +ENCODING 7879 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EC8 +ENCODING 7880 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 18 1 0 +BITMAP +E0 +30 +70 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 1EC9 +ENCODING 7881 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 14 0 0 +BITMAP +F0 +10 +30 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 1ECA +ENCODING 7882 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 17 2 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR 1ECB +ENCODING 7883 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 17 1 -3 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR 1ECC +ENCODING 7884 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 17 1 -3 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1ECD +ENCODING 7885 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1ECE +ENCODING 7886 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0700 +0180 +0300 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ECF +ENCODING 7887 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED0 +ENCODING 7888 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0300 +0200 +0700 +0D80 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ED1 +ENCODING 7889 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED2 +ENCODING 7890 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0400 +0200 +0700 +0D80 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ED3 +ENCODING 7891 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1000 +1800 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED4 +ENCODING 7892 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0700 +0300 +0700 +0D80 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ED5 +ENCODING 7893 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3C00 +0400 +0C00 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED6 +ENCODING 7894 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0E40 +1380 +0700 +0D80 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ED7 +ENCODING 7895 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3200 +4E00 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED8 +ENCODING 7896 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 20 1 -3 +BITMAP +0700 +0D80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1ED9 +ENCODING 7897 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EDA +ENCODING 7898 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0300 +0300 +0600 +0000 +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1EDB +ENCODING 7899 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EDC +ENCODING 7900 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0C00 +0600 +0200 +0000 +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1EDD +ENCODING 7901 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +3000 +1800 +0800 +0000 +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EDE +ENCODING 7902 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0700 +0180 +0300 +0000 +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1EDF +ENCODING 7903 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EE0 +ENCODING 7904 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0EC0 +0F80 +1B80 +0000 +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1EE1 +ENCODING 7905 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +3200 +7E00 +4E00 +0000 +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EE2 +ENCODING 7906 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 17 1 -3 +BITMAP +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EE3 +ENCODING 7907 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 13 1 -3 +BITMAP +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EE4 +ENCODING 7908 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 17 1 -3 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EE5 +ENCODING 7909 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 13 1 -3 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +00 +18 +18 +ENDCHAR +STARTCHAR 1EE6 +ENCODING 7910 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0E00 +0300 +0700 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EE7 +ENCODING 7911 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +3C +04 +0C +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 1EE8 +ENCODING 7912 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0300 +0600 +0400 +0000 +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EE9 +ENCODING 7913 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +0C00 +0C00 +1800 +0000 +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 1EEA +ENCODING 7914 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0C00 +0400 +0600 +0000 +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EEB +ENCODING 7915 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +3000 +1800 +0800 +0000 +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 1EEC +ENCODING 7916 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0E00 +0300 +0700 +0000 +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EED +ENCODING 7917 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +3C00 +0400 +0C00 +0000 +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 1EEE +ENCODING 7918 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0C80 +1F80 +1300 +0000 +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EEF +ENCODING 7919 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +3200 +7E00 +6E00 +0000 +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 1EF0 +ENCODING 7920 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 17 1 -3 +BITMAP +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EF1 +ENCODING 7921 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 -3 +BITMAP +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EF2 +ENCODING 7922 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0C00 +0600 +0200 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EF3 +ENCODING 7923 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +30 +10 +18 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 1EF4 +ENCODING 7924 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 17 0 -3 +BITMAP +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EF5 +ENCODING 7925 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +36 +F6 +E0 +ENDCHAR +STARTCHAR 1EF6 +ENCODING 7926 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0F00 +0100 +0300 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EF7 +ENCODING 7927 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +38 +04 +1C +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 1EF8 +ENCODING 7928 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0EC0 +0F80 +1B80 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EF9 +ENCODING 7929 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +32 +7E +4C +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 200C +ENCODING 8204 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 15 0 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 200D +ENCODING 8205 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 16 -2 -2 +BITMAP +90 +E0 +D0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 200E +ENCODING 8206 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 15 0 -3 +BITMAP +20 +F0 +A0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 200F +ENCODING 8207 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 15 -4 -3 +BITMAP +40 +F0 +50 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 2013 +ENCODING 8211 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 2 0 4 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR 2014 +ENCODING 8212 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 19 2 0 4 +BITMAP +FFFFE0 +FFFFE0 +ENDCHAR +STARTCHAR 2015 +ENCODING 8213 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 2 1 4 +BITMAP +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR 2017 +ENCODING 8215 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 5 0 -6 +BITMAP +FFE0 +FFE0 +0000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 2018 +ENCODING 8216 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +40 +C0 +80 +C0 +C0 +ENDCHAR +STARTCHAR 2019 +ENCODING 8217 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR 201A +ENCODING 8218 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 -3 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR 201B +ENCODING 8219 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +C0 +C0 +80 +C0 +40 +ENDCHAR +STARTCHAR 201C +ENCODING 8220 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 5 1 9 +BITMAP +50 +90 +90 +D0 +D0 +ENDCHAR +STARTCHAR 201D +ENCODING 8221 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 5 1 9 +BITMAP +D0 +D0 +50 +90 +90 +ENDCHAR +STARTCHAR 201E +ENCODING 8222 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 5 1 -3 +BITMAP +D0 +D0 +50 +90 +90 +ENDCHAR +STARTCHAR 2020 +ENCODING 8224 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +1800 +1800 +1800 +FF80 +FF80 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +ENDCHAR +STARTCHAR 2021 +ENCODING 8225 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +1800 +1800 +1800 +FF80 +FF80 +1800 +1800 +1800 +1800 +1800 +FF80 +FF80 +1800 +1800 +1800 +1800 +ENDCHAR +STARTCHAR 2022 +ENCODING 8226 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 5 1 4 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR 2026 +ENCODING 8230 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 15 2 2 0 +BITMAP +C106 +C106 +ENDCHAR +STARTCHAR 202A +ENCODING 8234 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 14 0 -3 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 202B +ENCODING 8235 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 14 -4 -3 +BITMAP +F0 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 202C +ENCODING 8236 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 16 -2 -3 +BITMAP +F0 +F0 +F0 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 202D +ENCODING 8237 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +F0 +80 +80 +80 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 202E +ENCODING 8238 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +F0 +10 +10 +10 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 2030 +ENCODING 8240 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 19 14 0 0 +BITMAP +78C000 +488000 +CC8000 +CD0000 +CD0000 +4B0000 +7A0000 +02E3C0 +059240 +059660 +0D1660 +099660 +099240 +10E3C0 +ENDCHAR +STARTCHAR 2032 +ENCODING 8242 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 5 1 9 +BITMAP +60 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR 2033 +ENCODING 8243 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 5 1 9 +BITMAP +78 +58 +D8 +D0 +90 +ENDCHAR +STARTCHAR 2039 +ENCODING 8249 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 9 1 1 +BITMAP +30 +20 +60 +40 +C0 +40 +60 +20 +30 +ENDCHAR +STARTCHAR 203A +ENCODING 8250 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 9 1 1 +BITMAP +C0 +40 +60 +20 +30 +20 +60 +40 +C0 +ENDCHAR +STARTCHAR 203C +ENCODING 8252 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 14 2 0 +BITMAP +CC +CC +CC +CC +CC +CC +CC +8C +8C +88 +88 +00 +CC +CC +ENDCHAR +STARTCHAR 203E +ENCODING 8254 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 7 2 0 11 +BITMAP +FE +FE +ENDCHAR +STARTCHAR 2044 +ENCODING 8260 +SWIDTH 154 0 +DWIDTH 3 0 +BBX 11 14 -4 0 +BITMAP +0020 +0040 +00C0 +0180 +0100 +0200 +0600 +0400 +0800 +1800 +3000 +2000 +4000 +C000 +ENDCHAR +STARTCHAR 206A +ENCODING 8298 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +F0 +40 +40 +40 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206B +ENCODING 8299 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +F0 +90 +90 +90 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206C +ENCODING 8300 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 16 -2 -3 +BITMAP +F0 +60 +60 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206D +ENCODING 8301 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 16 -2 -3 +BITMAP +40 +60 +60 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206E +ENCODING 8302 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +40 +60 +90 +60 +60 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206F +ENCODING 8303 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +C0 +40 +40 +40 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 207F +ENCODING 8319 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 7 1 5 +BITMAP +B0 +F8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR 20A3 +ENCODING 8355 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +3FC0 +3FC0 +2000 +2000 +2000 +2000 +3F80 +3F80 +2000 +2000 +FC00 +FC00 +2000 +2000 +ENDCHAR +STARTCHAR 20A4 +ENCODING 8356 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +1F00 +3F80 +3180 +60C0 +6000 +FE00 +FE00 +3000 +FE00 +FE00 +3000 +7C40 +FFC0 +4380 +ENDCHAR +STARTCHAR 20A7 +ENCODING 8359 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 14 0 0 +BITMAP +FE0000 +FF3000 +C3B000 +C1B000 +C1FFC0 +C3FFF0 +FFB430 +FE3700 +C037E0 +C031F0 +C03030 +C03630 +C03FF0 +C03BE0 +ENDCHAR +STARTCHAR 20AA +ENCODING 8362 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 10 1 0 +BITMAP +FF18 +FF98 +C098 +CC98 +CC98 +CC98 +CC98 +CC18 +CFF8 +CFF0 +ENDCHAR +STARTCHAR 20AB +ENCODING 8363 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 11 1 3 +BITMAP +0E +04 +3C +44 +44 +C4 +44 +44 +3C +00 +FE +ENDCHAR +STARTCHAR 20AC +ENCODING 8364 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0780 +1FC0 +3840 +3000 +6000 +6000 +FF80 +6000 +FF80 +6000 +3000 +3840 +1FC0 +0780 +ENDCHAR +STARTCHAR 2105 +ENCODING 8453 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +7820 +CC60 +8040 +80C0 +8480 +C980 +7900 +033C +0244 +0642 +04C2 +0842 +0844 +103C +ENDCHAR +STARTCHAR 2113 +ENCODING 8467 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 14 1 0 +BITMAP +30 +78 +48 +48 +50 +50 +60 +60 +C0 +C0 +40 +40 +78 +78 +ENDCHAR +STARTCHAR 2116 +ENCODING 8470 +SWIDTH 1028 0 +DWIDTH 20 0 +BBX 19 14 1 0 +BITMAP +E06000 +E06000 +F06000 +F06780 +D86FC0 +CC6C40 +CC6C60 +C66C40 +C76FC0 +C36780 +C1E000 +C1EFC0 +C0EFC0 +C06000 +ENDCHAR +STARTCHAR 2122 +ENCODING 8482 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 15 8 2 6 +BITMAP +FD86 +118E +114E +114E +1156 +1136 +1136 +1136 +ENDCHAR +STARTCHAR 2126 +ENCODING 8486 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7060 +6030 +6030 +C030 +C010 +C010 +6030 +6030 +3060 +18C0 +FDF8 +FDF8 +ENDCHAR +STARTCHAR 212E +ENCODING 8494 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 10 1 0 +BITMAP +3E00 +6100 +C180 +C180 +FFC0 +C000 +C000 +C080 +6100 +3E00 +ENDCHAR +STARTCHAR 2153 +ENCODING 8531 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +2010 +6030 +E020 +A040 +20C0 +2180 +2100 +023C +0664 +0C04 +0818 +1006 +3066 +603C +ENDCHAR +STARTCHAR 2154 +ENCODING 8532 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +7808 +4C18 +0C10 +1820 +3060 +60C0 +FC80 +011E +0332 +0602 +040C +0802 +1822 +301E +ENDCHAR +STARTCHAR 215B +ENCODING 8539 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +2010 +6030 +A020 +2040 +20C0 +2180 +2100 +0238 +0664 +0C64 +0838 +1044 +3044 +603C +ENDCHAR +STARTCHAR 215C +ENCODING 8540 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +7808 +4C18 +0C10 +1020 +0C60 +CCC0 +7880 +011E +0332 +0632 +041C +0822 +1822 +301E +ENDCHAR +STARTCHAR 215D +ENCODING 8541 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +7C08 +4018 +7810 +4C20 +0460 +CCC0 +7880 +011E +0332 +0632 +041C +0822 +1822 +301E +ENDCHAR +STARTCHAR 215E +ENCODING 8542 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +F810 +1020 +3060 +2040 +6080 +4180 +4300 +0238 +0464 +0C64 +1838 +1044 +2044 +603C +ENDCHAR +STARTCHAR 2190 +ENCODING 8592 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 6 1 1 +BITMAP +100000 +200000 +600000 +FFFF80 +600000 +100000 +ENDCHAR +STARTCHAR 2191 +ENCODING 8593 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 16 1 -4 +BITMAP +10 +38 +7C +D2 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 2192 +ENCODING 8594 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 6 1 1 +BITMAP +000400 +000200 +000300 +FFFF80 +000200 +000400 +ENDCHAR +STARTCHAR 2193 +ENCODING 8595 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 16 1 -4 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +90 +56 +3C +18 +10 +ENDCHAR +STARTCHAR 2194 +ENCODING 8596 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 7 1 1 +BITMAP +100400 +200200 +600300 +FFFF80 +600300 +100400 +100400 +ENDCHAR +STARTCHAR 2195 +ENCODING 8597 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 18 1 -4 +BITMAP +10 +18 +38 +74 +92 +10 +10 +10 +10 +10 +10 +10 +10 +90 +56 +3C +18 +10 +ENDCHAR +STARTCHAR 21A8 +ENCODING 8616 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 20 1 -6 +BITMAP +10 +18 +38 +74 +92 +10 +10 +10 +10 +10 +10 +10 +10 +90 +56 +3C +18 +10 +00 +FE +ENDCHAR +STARTCHAR 2202 +ENCODING 8706 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +0E +1E +33 +21 +01 +0F +3D +61 +C3 +82 +86 +CC +FC +70 +ENDCHAR +STARTCHAR 2206 +ENCODING 8710 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 12 0 1 +BITMAP +0600 +0600 +0A00 +0B00 +1100 +1180 +2180 +20C0 +20C0 +4040 +4060 +FFE0 +ENDCHAR +STARTCHAR 220F +ENCODING 8719 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 18 1 -4 +BITMAP +FFF8 +FFF8 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +ENDCHAR +STARTCHAR 2211 +ENCODING 8721 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +FFF0 +FFF0 +6000 +3000 +3800 +1800 +0C00 +0600 +0300 +0700 +0600 +0C00 +1800 +3000 +6000 +6000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 2212 +ENCODING 8722 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 2 1 6 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR 2215 +ENCODING 8725 +SWIDTH 154 0 +DWIDTH 3 0 +BBX 11 14 -4 0 +BITMAP +0020 +0040 +00C0 +0180 +0100 +0200 +0600 +0400 +0800 +1800 +3000 +2000 +4000 +C000 +ENDCHAR +STARTCHAR 2219 +ENCODING 8729 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 2 2 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 221A +ENCODING 8730 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 18 1 -1 +BITMAP +0080 +0080 +0080 +0080 +0080 +0080 +0100 +2100 +E100 +3100 +1900 +1900 +0E00 +0E00 +0600 +0600 +0200 +0200 +ENDCHAR +STARTCHAR 221E +ENCODING 8734 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 6 1 4 +BITMAP +71C0 +7BE0 +CE20 +CE20 +7BE0 +71C0 +ENDCHAR +STARTCHAR 221F +ENCODING 8735 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 12 12 3 0 +BITMAP +8000 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +FFF0 +ENDCHAR +STARTCHAR 2229 +ENCODING 8745 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +0F00 +3FC0 +70C0 +6060 +4020 +4020 +C020 +C020 +C020 +C020 +C020 +C020 +C020 +C020 +ENDCHAR +STARTCHAR 222B +ENCODING 8747 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 19 0 -2 +BITMAP +18 +38 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR 2248 +ENCODING 8776 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 7 0 3 +BITMAP +7C40 +FFC0 +8780 +0000 +7C40 +FFC0 +8780 +ENDCHAR +STARTCHAR 2260 +ENCODING 8800 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +0300 +0200 +0200 +0400 +FF80 +FF80 +0800 +1800 +FF80 +FF80 +2000 +2000 +4000 +4000 +ENDCHAR +STARTCHAR 2261 +ENCODING 8801 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 2 +BITMAP +FF80 +FF80 +0000 +0000 +FF80 +FF80 +0000 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR 2264 +ENCODING 8804 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 0 +BITMAP +0080 +0780 +1E00 +7000 +C000 +7000 +1E00 +0780 +0080 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR 2265 +ENCODING 8805 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 0 +BITMAP +8000 +E000 +7800 +0F00 +0180 +0F00 +7800 +E000 +8000 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR 2302 +ENCODING 8962 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 1 +BITMAP +0C00 +1200 +2100 +4100 +8080 +8080 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR 2310 +ENCODING 8976 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 6 1 4 +BITMAP +FF80 +FF80 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 2320 +ENCODING 8992 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 4 21 5 -5 +BITMAP +70 +10 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2321 +ENCODING 8993 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 4 21 2 -5 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +D0 +60 +ENDCHAR +STARTCHAR 2500 +ENCODING 9472 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 2 0 5 +BITMAP +FFFC +FFFC +ENDCHAR +STARTCHAR 2502 +ENCODING 9474 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 2 23 4 -6 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 250C +ENCODING 9484 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 13 6 -6 +BITMAP +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 2510 +ENCODING 9488 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 13 0 -6 +BITMAP +FF +FF +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR 2514 +ENCODING 9492 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 12 6 5 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +FF +ENDCHAR +STARTCHAR 2518 +ENCODING 9496 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 12 0 5 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +FF +FF +ENDCHAR +STARTCHAR 251C +ENCODING 9500 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 23 6 -6 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 2524 +ENCODING 9508 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 23 0 -6 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +FF +FF +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR 252C +ENCODING 9516 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 13 0 -6 +BITMAP +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 2534 +ENCODING 9524 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 12 0 5 +BITMAP +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +FFFC +FFFC +ENDCHAR +STARTCHAR 253C +ENCODING 9532 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 2550 +ENCODING 9552 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 5 0 3 +BITMAP +FFFC +0000 +0000 +FFFC +FFFC +ENDCHAR +STARTCHAR 2551 +ENCODING 9553 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 5 23 4 -6 +BITMAP +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +ENDCHAR +STARTCHAR 2552 +ENCODING 9554 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 14 6 -6 +BITMAP +FF +C0 +C0 +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 2553 +ENCODING 9555 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 13 4 -6 +BITMAP +FFC0 +FFC0 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +ENDCHAR +STARTCHAR 2554 +ENCODING 9556 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 14 4 -6 +BITMAP +FFC0 +C000 +C000 +CFC0 +CFC0 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +ENDCHAR +STARTCHAR 2555 +ENCODING 9557 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 14 0 -6 +BITMAP +FF +03 +03 +FF +FF +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR 2556 +ENCODING 9558 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 13 0 -6 +BITMAP +FF80 +FF80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2557 +ENCODING 9559 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 14 0 -6 +BITMAP +FF80 +0080 +0080 +FC80 +FC80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2558 +ENCODING 9560 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 14 6 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +C0 +C0 +FF +FF +ENDCHAR +STARTCHAR 2559 +ENCODING 9561 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 12 4 5 +BITMAP +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 255A +ENCODING 9562 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 14 4 3 +BITMAP +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +CFC0 +C000 +C000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 255B +ENCODING 9563 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 14 0 3 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +FF +03 +03 +FF +FF +ENDCHAR +STARTCHAR 255C +ENCODING 9564 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 12 0 5 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FF80 +FF80 +ENDCHAR +STARTCHAR 255D +ENCODING 9565 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 14 0 3 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FC80 +0080 +0080 +FF80 +FF80 +ENDCHAR +STARTCHAR 255E +ENCODING 9566 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 23 6 -6 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +C0 +C0 +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 255F +ENCODING 9567 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 23 4 -6 +BITMAP +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +CFC0 +CFC0 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +ENDCHAR +STARTCHAR 2560 +ENCODING 9568 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 23 4 -6 +BITMAP +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +CFC0 +C000 +C000 +CFC0 +CFC0 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +ENDCHAR +STARTCHAR 2561 +ENCODING 9569 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 23 0 -6 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +FF +03 +03 +FF +FF +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR 2562 +ENCODING 9570 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 23 0 -6 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FC80 +FC80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2563 +ENCODING 9571 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 23 0 -6 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FC80 +0080 +0080 +FC80 +FC80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2564 +ENCODING 9572 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 14 0 -6 +BITMAP +FFFC +0000 +0000 +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 2565 +ENCODING 9573 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 13 0 -6 +BITMAP +FFFC +FFFC +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2566 +ENCODING 9574 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 14 0 -6 +BITMAP +FFFC +0000 +0000 +FCFC +FCFC +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2567 +ENCODING 9575 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 14 0 3 +BITMAP +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +FFFC +0000 +0000 +FFFC +FFFC +ENDCHAR +STARTCHAR 2568 +ENCODING 9576 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 12 0 5 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FFFC +FFFC +ENDCHAR +STARTCHAR 2569 +ENCODING 9577 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 14 0 3 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FCFC +0000 +0000 +FFFC +FFFC +ENDCHAR +STARTCHAR 256A +ENCODING 9578 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +FFFC +0300 +0300 +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 256B +ENCODING 9579 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FFFC +FFFC +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 256C +ENCODING 9580 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FCFC +0000 +0000 +FCFC +FCFC +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2580 +ENCODING 9600 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 11 0 6 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 2584 +ENCODING 9604 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 12 0 -6 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 2588 +ENCODING 9608 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 258C +ENCODING 9612 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 7 23 0 -6 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR 2590 +ENCODING 9616 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 7 23 7 -6 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR 2591 +ENCODING 9617 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 22 1 -5 +BITMAP +8440 +0000 +2118 +0000 +8440 +0000 +0000 +2118 +0000 +8440 +0000 +2118 +0000 +0000 +8440 +0000 +2118 +0000 +8440 +0000 +0000 +2118 +ENDCHAR +STARTCHAR 2592 +ENCODING 9618 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 22 0 -5 +BITMAP +52A4 +0000 +AD58 +0000 +52A4 +0000 +0000 +AD58 +0000 +52A4 +0000 +AD58 +0000 +0000 +52A4 +0000 +AD58 +0000 +52A4 +0000 +0000 +AD58 +ENDCHAR +STARTCHAR 2593 +ENCODING 9619 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 14 23 0 -6 +BITMAP +5AB4 +FFFC +A548 +FFFC +5AB4 +FFFC +FFFC +A548 +FFFC +5AB4 +FFFC +A548 +FFFC +FFFC +5AB4 +FFFC +A548 +FFFC +5AB4 +FFFC +FFFC +A548 +FFFC +ENDCHAR +STARTCHAR 25A0 +ENCODING 9632 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 25A1 +ENCODING 9633 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +FF80 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR 25AA +ENCODING 9642 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 4 1 4 +BITMAP +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR 25AB +ENCODING 9643 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 4 1 4 +BITMAP +88 +88 +88 +F8 +ENDCHAR +STARTCHAR 25AC +ENCODING 9644 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 19 4 0 3 +BITMAP +FFFFE0 +FFFFE0 +FFFFE0 +FFFFE0 +ENDCHAR +STARTCHAR 25B2 +ENCODING 9650 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 13 13 3 0 +BITMAP +0200 +0200 +0700 +0700 +0F80 +0F80 +1FC0 +1FC0 +3FE0 +3FE0 +7FF0 +7FF0 +FFF8 +ENDCHAR +STARTCHAR 25BA +ENCODING 9658 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 13 13 3 0 +BITMAP +8000 +E000 +F800 +FE00 +FF80 +FFE0 +FFF8 +FFE0 +FF80 +FE00 +F800 +E000 +8000 +ENDCHAR +STARTCHAR 25BC +ENCODING 9660 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 13 13 3 0 +BITMAP +FFF8 +7FF0 +7FF0 +3FE0 +3FE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0200 +0200 +ENDCHAR +STARTCHAR 25C4 +ENCODING 9668 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 13 13 3 0 +BITMAP +0008 +0038 +00F8 +03F8 +0FF8 +3FF8 +FFF8 +3FF8 +0FF8 +03F8 +00F8 +0038 +0008 +ENDCHAR +STARTCHAR 25CA +ENCODING 9674 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +10 +28 +28 +44 +42 +82 +81 +81 +82 +42 +44 +28 +28 +10 +ENDCHAR +STARTCHAR 25CB +ENCODING 9675 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 8 2 1 +BITMAP +44 +82 +81 +01 +01 +80 +42 +38 +ENDCHAR +STARTCHAR 25CF +ENCODING 9679 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 8 2 1 +BITMAP +7C +FE +FF +FF +FF +FE +7E +38 +ENDCHAR +STARTCHAR 25D8 +ENCODING 9688 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +FF80 +FF80 +FF80 +E380 +E180 +E380 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 25D9 +ENCODING 9689 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 11 0 0 +BITMAP +FFE0 +FFE0 +E6E0 +DF60 +DFA0 +FFA0 +FFA0 +DFE0 +EF60 +F1E0 +FFE0 +ENDCHAR +STARTCHAR 25E6 +ENCODING 9702 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 5 1 4 +BITMAP +20 +90 +88 +88 +70 +ENDCHAR +STARTCHAR 263A +ENCODING 9786 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 12 12 4 -1 +BITMAP +0E00 +3080 +4040 +8020 +91A0 +9190 +8010 +8000 +9120 +4E20 +20C0 +1F00 +ENDCHAR +STARTCHAR 263B +ENCODING 9787 +SWIDTH 1028 0 +DWIDTH 20 0 +BBX 12 12 4 -1 +BITMAP +0F00 +3FC0 +7FE0 +7FE0 +EF70 +EF70 +FFF0 +FFF0 +7FE0 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 263C +ENCODING 9788 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 17 17 0 -2 +BITMAP +008000 +008000 +208200 +11E400 +0C1800 +080800 +000400 +100400 +F00780 +100400 +000400 +080800 +0C1800 +11E400 +208200 +008000 +008000 +ENDCHAR +STARTCHAR 2640 +ENCODING 9792 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 -4 +BITMAP +1E00 +0080 +0000 +8040 +8040 +8040 +0040 +4000 +2000 +0E00 +0000 +0000 +0000 +7FC0 +ENDCHAR +STARTCHAR 2642 +ENCODING 9794 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 17 1 -2 +BITMAP +0060 +0160 +0440 +0000 +0090 +0010 +0100 +0000 +2300 +4080 +8000 +8040 +8040 +8040 +8000 +4080 +2100 +ENDCHAR +STARTCHAR 2660 +ENCODING 9824 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 1 1 +BITMAP +1800 +3C00 +7E00 +FF00 +FF00 +FF80 +E700 +0000 +1800 +3E00 +ENDCHAR +STARTCHAR 2663 +ENCODING 9827 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +1E00 +1F00 +1F00 +7EC0 +FFE0 +FFE0 +FFE0 +F3C0 +0400 +0C00 +3F00 +ENDCHAR +STARTCHAR 2665 +ENCODING 9829 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 11 1 0 +BITMAP +F780 +FFC0 +FFC0 +FF80 +7F80 +7F00 +3E00 +1E00 +1C00 +0800 +0800 +ENDCHAR +STARTCHAR 2666 +ENCODING 9830 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +10 +18 +3C +7E +FE +FF +FE +7C +3C +18 +10 +ENDCHAR +STARTCHAR 266A +ENCODING 9834 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +0600 +0780 +0380 +0080 +0080 +0000 +0000 +0000 +0000 +7800 +F800 +F800 +7800 +ENDCHAR +STARTCHAR 266B +ENCODING 9835 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 15 1 -1 +BITMAP +0060 +03E0 +0FE0 +0E20 +0820 +0820 +0820 +0820 +0820 +09E0 +0BE0 +FBE0 +F9E0 +F800 +F000 +ENDCHAR +STARTCHAR E801 +ENCODING 59393 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 12 -1 0 +BITMAP +C0 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR E802 +ENCODING 59394 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 -4 +BITMAP +FC +FE +07 +03 +01 +01 +01 +31 +01 +31 +01 +01 +01 +01 +ENDCHAR +STARTCHAR E803 +ENCODING 59395 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 -4 +BITMAP +FC +FE +07 +03 +01 +01 +01 +79 +11 +11 +01 +01 +01 +01 +ENDCHAR +STARTCHAR E804 +ENCODING 59396 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 10 14 -2 0 +BITMAP +1000 +D000 +1000 +1000 +1FC0 +1FC0 +00C0 +00C0 +0080 +0180 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR E805 +ENCODING 59397 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 10 14 -2 0 +BITMAP +1000 +D000 +1000 +1000 +1FC0 +1FC0 +00C0 +0CC0 +0080 +0180 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR E818 +ENCODING 59416 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 7 1 12 +BITMAP +60 +80 +60 +80 +40 +60 +80 +ENDCHAR +STARTCHAR E83A +ENCODING 59450 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 13 2 -1 3 +BITMAP +FFF8 +FFF8 +ENDCHAR +STARTCHAR F001 +ENCODING 61441 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +1D +3D +30 +20 +F9 +F9 +21 +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR F002 +ENCODING 61442 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +1D +3D +31 +21 +F9 +F9 +21 +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR F004 +ENCODING 61444 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 4 2 -5 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR F005 +ENCODING 61445 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 3 1 -4 +BITMAP +70 +30 +E0 +ENDCHAR +STARTCHAR F006 +ENCODING 61446 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 2 -4 16 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR F007 +ENCODING 61447 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 16 +BITMAP +C0 +80 +ENDCHAR +STARTCHAR F008 +ENCODING 61448 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -3 11 +BITMAP +60 +40 +C0 +ENDCHAR +STARTCHAR F009 +ENCODING 61449 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -6 15 +BITMAP +60 +40 +C0 +ENDCHAR +STARTCHAR F00A +ENCODING 61450 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 21 0 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +00 +00 +00 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR F00B +ENCODING 61451 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 21 -2 -4 +BITMAP +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +F0 +ENDCHAR +STARTCHAR F00C +ENCODING 61452 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 21 0 -4 +BITMAP +80 +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR F00D +ENCODING 61453 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 21 -2 -4 +BITMAP +40 +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR F00E +ENCODING 61454 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 21 0 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR F00F +ENCODING 61455 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -8 11 +BITMAP +C0 +60 +20 +ENDCHAR +STARTCHAR F010 +ENCODING 61456 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 2 -5 16 +BITMAP +F0 +30 +ENDCHAR +STARTCHAR F011 +ENCODING 61457 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 2 -8 16 +BITMAP +E0 +60 +ENDCHAR +STARTCHAR F012 +ENCODING 61458 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -4 11 +BITMAP +E0 +30 +70 +ENDCHAR +STARTCHAR F013 +ENCODING 61459 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -7 15 +BITMAP +E0 +30 +70 +ENDCHAR +STARTCHAR F014 +ENCODING 61460 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -7 11 +BITMAP +E0 +30 +70 +ENDCHAR +STARTCHAR F015 +ENCODING 61461 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 2 -10 16 +BITMAP +72 +9C +ENDCHAR +STARTCHAR F016 +ENCODING 61462 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -10 15 +BITMAP +64 +9C +ENDCHAR +STARTCHAR F017 +ENCODING 61463 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -12 15 +BITMAP +64 +9C +ENDCHAR +STARTCHAR F018 +ENCODING 61464 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 2 -13 15 +BITMAP +76 +DC +ENDCHAR +STARTCHAR F019 +ENCODING 61465 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -8 11 +BITMAP +EC +98 +ENDCHAR +STARTCHAR F01A +ENCODING 61466 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -10 11 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F01B +ENCODING 61467 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -11 11 +BITMAP +64 +9C +ENDCHAR +STARTCHAR F01C +ENCODING 61468 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -6 15 +BITMAP +74 +DC +ENDCHAR +STARTCHAR F01D +ENCODING 61469 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -5 11 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F01E +ENCODING 61470 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F01F +ENCODING 61471 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -8 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F020 +ENCODING 61472 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -10 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F021 +ENCODING 61473 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -8 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F022 +ENCODING 61474 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 2 -10 -3 +BITMAP +80 +80 +ENDCHAR +STARTCHAR F023 +ENCODING 61475 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -6 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F024 +ENCODING 61476 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -6 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F025 +ENCODING 61477 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -6 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F026 +ENCODING 61478 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -8 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F027 +ENCODING 61479 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F028 +ENCODING 61480 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -9 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F029 +ENCODING 61481 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -4 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F02A +ENCODING 61482 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -3 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F02B +ENCODING 61483 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F02C +ENCODING 61484 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -2 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F02D +ENCODING 61485 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -9 16 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F02E +ENCODING 61486 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -9 15 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F02F +ENCODING 61487 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -10 16 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F030 +ENCODING 61488 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -10 15 +BITMAP +EC +98 +ENDCHAR +STARTCHAR F031 +ENCODING 61489 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR FB01 +ENCODING 64257 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +1D +3D +30 +20 +F9 +F9 +21 +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR FB02 +ENCODING 64258 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +1D +3D +31 +21 +F9 +F9 +21 +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR FB1D +ENCODING 64285 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 8 1 2 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +00 +40 +ENDCHAR +STARTCHAR FB1E +ENCODING 64286 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -3 12 +BITMAP +CC +78 +ENDCHAR +STARTCHAR FB1F +ENCODING 64287 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 7 1 3 +BITMAP +C6 +C6 +C6 +C6 +C6 +00 +FE +ENDCHAR +STARTCHAR FB20 +ENCODING 64288 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +6180 +2180 +3180 +3180 +3180 +3180 +1300 +1B00 +FE00 +FC00 +ENDCHAR +STARTCHAR FB2A +ENCODING 64298 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +0020 +0000 +0000 +C460 +C460 +C460 +CC60 +CC60 +F860 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB2B +ENCODING 64299 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +C000 +0000 +0000 +C460 +C460 +C460 +CC60 +CC60 +F860 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB2C +ENCODING 64300 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +0020 +0000 +0000 +C460 +C460 +C460 +CC60 +CC60 +FB60 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB2D +ENCODING 64301 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +C000 +0000 +0000 +C460 +C460 +C460 +CC60 +CC60 +FB60 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB2E +ENCODING 64302 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +E180 +6100 +3300 +3B00 +7F00 +4E00 +C600 +C600 +C300 +C180 +0000 +0000 +3C00 +ENDCHAR +STARTCHAR FB2F +ENCODING 64303 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 15 1 -5 +BITMAP +E180 +6100 +3300 +3B00 +7F00 +4E00 +C600 +C600 +C300 +C180 +0000 +0000 +3C00 +0800 +0800 +ENDCHAR +STARTCHAR FB30 +ENCODING 64304 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +E180 +6100 +3300 +3B00 +7F00 +4E00 +C600 +C600 +DB00 +C180 +ENDCHAR +STARTCHAR FB31 +ENCODING 64305 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 10 0 0 +BITMAP +7C00 +7E00 +0700 +0300 +3100 +0100 +0100 +0100 +FFC0 +FFC0 +ENDCHAR +STARTCHAR FB32 +ENCODING 64306 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +78 +7C +0C +3C +0C +1C +3C +64 +66 +C6 +ENDCHAR +STARTCHAR FB33 +ENCODING 64307 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +FF80 +FF80 +0300 +1B00 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR FB34 +ENCODING 64308 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +FE00 +7F00 +0380 +0180 +C980 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR FB35 +ENCODING 64309 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 10 0 0 +BITMAP +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR FB36 +ENCODING 64310 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +3F +3F +0C +D8 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR FB38 +ENCODING 64312 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +C700 +CF80 +C980 +C180 +CD80 +C180 +C180 +6380 +7F00 +1E00 +ENDCHAR +STARTCHAR FB39 +ENCODING 64313 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 5 0 5 +BITMAP +30 +30 +F0 +30 +30 +ENDCHAR +STARTCHAR FB3A +ENCODING 64314 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 -4 +BITMAP +FC +FE +07 +03 +11 +01 +01 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR FB3B +ENCODING 64315 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +F0 +FC +0C +06 +66 +06 +06 +0C +FC +F0 +ENDCHAR +STARTCHAR FB3C +ENCODING 64316 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +80 +80 +80 +80 +FE +FE +06 +26 +04 +0C +18 +18 +18 +18 +ENDCHAR +STARTCHAR FB3E +ENCODING 64318 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +CE00 +DF00 +7180 +6180 +6D80 +6180 +4180 +4180 +CF80 +CF80 +ENDCHAR +STARTCHAR FB40 +ENCODING 64320 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +E0 +F0 +30 +10 +90 +10 +10 +10 +F0 +F0 +ENDCHAR +STARTCHAR FB41 +ENCODING 64321 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +E380 +C180 +C980 +C180 +C180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR FB43 +ENCODING 64323 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +FC +FF +C3 +C3 +C1 +CD +61 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR FB44 +ENCODING 64324 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 1 0 +BITMAP +FC00 +FE00 +C700 +C300 +C180 +6D80 +0300 +8700 +FE00 +7C00 +ENDCHAR +STARTCHAR FB46 +ENCODING 64326 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +C3 +63 +33 +33 +7E +0C +04 +06 +7F +7F +ENDCHAR +STARTCHAR FB47 +ENCODING 64327 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +FF +FF +01 +19 +43 +43 +46 +44 +44 +44 +40 +40 +40 +40 +ENDCHAR +STARTCHAR FB48 +ENCODING 64328 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 0 0 +BITMAP +FC +FE +07 +03 +11 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR FB49 +ENCODING 64329 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +C460 +C460 +C460 +CC60 +CC60 +FB60 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB4A +ENCODING 64330 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +7F80 +7FC0 +18E0 +1860 +1B60 +1860 +1860 +1860 +7860 +F060 +ENDCHAR +STARTCHAR FB4B +ENCODING 64331 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 13 1 0 +BITMAP +40 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR FB4C +ENCODING 64332 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +1C00 +0000 +0000 +7C00 +7E00 +0700 +0300 +0100 +0100 +0100 +0100 +FFC0 +FFC0 +ENDCHAR +STARTCHAR FB4D +ENCODING 64333 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +78 +00 +00 +F0 +FC +0C +06 +06 +06 +06 +0C +FC +F0 +ENDCHAR +STARTCHAR FB4E +ENCODING 64334 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 1 0 +BITMAP +3C00 +0000 +0000 +FC00 +FE00 +C700 +C300 +C180 +7180 +0300 +8700 +FE00 +7C00 +ENDCHAR +STARTCHAR FB4F +ENCODING 64335 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +8000 +8000 +8000 +8000 +E180 +E180 +3180 +3B00 +7F00 +6E00 +4600 +4700 +C300 +C180 +ENDCHAR +STARTCHAR FB50 +ENCODING 64336 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 15 0 2 +BITMAP +30 +F0 +80 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR FB51 +ENCODING 64337 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 14 -1 3 +BITMAP +30 +F0 +00 +00 +60 +20 +20 +20 +20 +20 +20 +20 +18 +18 +ENDCHAR +STARTCHAR FB52 +ENCODING 64338 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0200 +0200 +0200 +0200 +ENDCHAR +STARTCHAR FB53 +ENCODING 64339 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0200 +0200 +0200 +0200 +ENDCHAR +STARTCHAR FB54 +ENCODING 64340 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +30 +30 +10 +10 +ENDCHAR +STARTCHAR FB55 +ENCODING 64341 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +30 +30 +10 +10 +ENDCHAR +STARTCHAR FB56 +ENCODING 64342 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0100 +0500 +0700 +0300 +ENDCHAR +STARTCHAR FB57 +ENCODING 64343 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0100 +0500 +0700 +0300 +ENDCHAR +STARTCHAR FB58 +ENCODING 64344 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +38 +18 +ENDCHAR +STARTCHAR FB59 +ENCODING 64345 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +38 +18 +ENDCHAR +STARTCHAR FB5A +ENCODING 64346 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 12 1 -3 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0300 +0D00 +0D00 +0500 +0400 +ENDCHAR +STARTCHAR FB5B +ENCODING 64347 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 12 1 -3 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0300 +0D00 +0D00 +0500 +0400 +ENDCHAR +STARTCHAR FB5C +ENCODING 64348 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 -3 +BITMAP +08 +08 +0C +04 +FC +FC +00 +18 +68 +68 +28 +20 +ENDCHAR +STARTCHAR FB5D +ENCODING 64349 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 -3 +BITMAP +08 +08 +0C +04 +FC +FC +00 +18 +68 +68 +28 +20 +ENDCHAR +STARTCHAR FB5E +ENCODING 64350 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0400 +0400 +0600 +0200 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB5F +ENCODING 64351 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0400 +0400 +0600 +0200 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB60 +ENCODING 64352 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +20 +20 +30 +10 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB61 +ENCODING 64353 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +20 +20 +30 +10 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB62 +ENCODING 64354 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0200 +0A00 +0900 +0D00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB63 +ENCODING 64355 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0200 +0A00 +0900 +0D00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB64 +ENCODING 64356 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +50 +48 +68 +60 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB65 +ENCODING 64357 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +50 +48 +68 +60 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB66 +ENCODING 64358 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 13 1 3 +BITMAP +0400 +0800 +0400 +0780 +0480 +1F80 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB67 +ENCODING 64359 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 13 1 3 +BITMAP +0400 +0800 +0400 +0780 +0480 +1F80 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB68 +ENCODING 64360 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +20 +20 +20 +2C +34 +7C +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB69 +ENCODING 64361 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +20 +20 +20 +2C +34 +7C +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB6A +ENCODING 64362 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0010 +001C +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FB6B +ENCODING 64363 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0010 +001C +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FB6C +ENCODING 64364 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 3 +BITMAP +20 +38 +78 +60 +18 +38 +2C +3C +3C +04 +FC +FC +ENDCHAR +STARTCHAR FB6D +ENCODING 64365 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 3 +BITMAP +20 +28 +68 +20 +18 +1C +24 +24 +1C +0C +FC +FC +ENDCHAR +STARTCHAR FB6E +ENCODING 64366 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 12 0 3 +BITMAP +0004 +0014 +0014 +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FB6F +ENCODING 64367 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 12 0 3 +BITMAP +0004 +0014 +0014 +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FB70 +ENCODING 64368 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 14 -1 3 +BITMAP +10 +50 +48 +68 +60 +00 +18 +38 +2C +3C +3C +04 +FC +FC +ENDCHAR +STARTCHAR FB71 +ENCODING 64369 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 14 -1 3 +BITMAP +10 +50 +48 +68 +60 +00 +18 +1C +24 +24 +1C +0C +FC +FC +ENDCHAR +STARTCHAR FB72 +ENCODING 64370 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8400 +8400 +8600 +4600 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB73 +ENCODING 64371 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8800 +8800 +8C00 +4C00 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB74 +ENCODING 64372 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 -2 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0400 +0400 +0600 +0600 +ENDCHAR +STARTCHAR FB75 +ENCODING 64373 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 -2 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0400 +0400 +0600 +0600 +ENDCHAR +STARTCHAR FB76 +ENCODING 64374 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8300 +8B00 +8800 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB77 +ENCODING 64375 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8400 +9400 +9000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB78 +ENCODING 64376 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 -1 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0800 +ENDCHAR +STARTCHAR FB79 +ENCODING 64377 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 -1 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0800 +ENDCHAR +STARTCHAR FB7A +ENCODING 64378 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4200 +8B00 +8A00 +8200 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB7B +ENCODING 64379 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8400 +9400 +9400 +4400 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB7C +ENCODING 64380 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 -2 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0E00 +0200 +ENDCHAR +STARTCHAR FB7D +ENCODING 64381 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 -2 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0E00 +0200 +ENDCHAR +STARTCHAR FB7E +ENCODING 64382 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4300 +8B00 +8D00 +8500 +4400 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB7F +ENCODING 64383 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +45C0 +9400 +9600 +9E00 +5800 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB80 +ENCODING 64384 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 12 -1 -3 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0B00 +0D00 +0C00 +ENDCHAR +STARTCHAR FB81 +ENCODING 64385 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 12 -1 -3 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0B00 +0D00 +0C00 +ENDCHAR +STARTCHAR FB82 +ENCODING 64386 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 -1 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +00 +10 +50 +40 +ENDCHAR +STARTCHAR FB83 +ENCODING 64387 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 -1 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +00 +10 +50 +40 +ENDCHAR +STARTCHAR FB84 +ENCODING 64388 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +30 +D0 +C0 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FB85 +ENCODING 64389 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +30 +D0 +C0 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FB86 +ENCODING 64390 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 13 1 3 +BITMAP +40 +50 +50 +40 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FB87 +ENCODING 64391 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 13 1 3 +BITMAP +40 +50 +50 +40 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FB88 +ENCODING 64392 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 15 0 3 +BITMAP +20 +20 +20 +2C +34 +FC +00 +10 +18 +0C +04 +04 +04 +7C +7C +ENDCHAR +STARTCHAR FB89 +ENCODING 64393 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 15 0 3 +BITMAP +20 +20 +20 +2C +34 +FC +00 +10 +18 +0C +04 +04 +04 +7C +7C +ENDCHAR +STARTCHAR FB8A +ENCODING 64394 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 15 1 -2 +BITMAP +0C +0F +0B +08 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FB8B +ENCODING 64395 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 15 1 -2 +BITMAP +0C +0F +0B +08 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FB8C +ENCODING 64396 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 17 1 -2 +BITMAP +08 +10 +08 +0F +09 +3F +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FB8D +ENCODING 64397 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 17 1 -2 +BITMAP +08 +10 +08 +0F +09 +3F +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FB8E +ENCODING 64398 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0006 +001E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR FB8F +ENCODING 64399 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 11 0 3 +BITMAP +000600 +001E00 +007800 +004000 +006000 +007000 +001800 +800C00 +801200 +FFF3C0 +7FE1C0 +ENDCHAR +STARTCHAR FB90 +ENCODING 64400 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 11 -1 3 +BITMAP +03 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FB91 +ENCODING 64401 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 3 +BITMAP +0300 +0F00 +3C00 +2000 +3000 +3800 +0C00 +0600 +0900 +F9E0 +F0E0 +ENDCHAR +STARTCHAR FB92 +ENCODING 64402 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR FB93 +ENCODING 64403 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 14 0 3 +BITMAP +000200 +000E00 +003800 +006600 +009E00 +007800 +004000 +006000 +007000 +001800 +800C00 +801200 +FFF3C0 +7FE1C0 +ENDCHAR +STARTCHAR FB94 +ENCODING 64404 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 14 -1 3 +BITMAP +01 +07 +1C +33 +4F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FB95 +ENCODING 64405 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 14 -1 3 +BITMAP +0100 +0700 +1C00 +3300 +4F00 +3C00 +2000 +3000 +3800 +0C00 +0600 +0900 +F9E0 +F0E0 +ENDCHAR +STARTCHAR FB96 +ENCODING 64406 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 19 0 -2 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +0000 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR FB97 +ENCODING 64407 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 19 0 -2 +BITMAP +000200 +000E00 +003800 +006600 +009E00 +007800 +004000 +006000 +007000 +001800 +800C00 +801200 +FFF3C0 +7FE1C0 +000000 +020000 +020000 +020000 +020000 +ENDCHAR +STARTCHAR FB98 +ENCODING 64408 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 19 -1 -2 +BITMAP +01 +07 +1C +33 +4F +3C +20 +30 +38 +0C +02 +01 +FF +FF +00 +08 +08 +0C +0C +ENDCHAR +STARTCHAR FB99 +ENCODING 64409 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 19 -1 -2 +BITMAP +0100 +0700 +1C00 +3300 +4F00 +3C00 +2000 +3000 +3800 +0C00 +0600 +0900 +F9E0 +F0E0 +0000 +3000 +3000 +1000 +1000 +ENDCHAR +STARTCHAR FB9A +ENCODING 64410 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0012 +004E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR FB9B +ENCODING 64411 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 14 0 3 +BITMAP +001200 +004E00 +003800 +006600 +009E00 +007800 +004000 +006000 +007000 +001800 +800C00 +801200 +FFF3C0 +7FE1C0 +ENDCHAR +STARTCHAR FB9C +ENCODING 64412 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 14 -1 3 +BITMAP +09 +27 +1C +33 +4F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FB9D +ENCODING 64413 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 14 -1 3 +BITMAP +0900 +2700 +1C00 +3300 +4F00 +3C00 +2000 +3000 +3800 +0C00 +0600 +0900 +F9E0 +F0E0 +ENDCHAR +STARTCHAR FB9E +ENCODING 64414 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FB9F +ENCODING 64415 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FBA0 +ENCODING 64416 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 1 -1 +BITMAP +1000 +1000 +1000 +1600 +1A00 +3E00 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FBA1 +ENCODING 64417 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 1 -1 +BITMAP +1000 +1000 +1000 +1600 +1A00 +3E00 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FBA2 +ENCODING 64418 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +20 +20 +20 +2C +34 +7C +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FBA3 +ENCODING 64419 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +20 +20 +20 +2C +34 +7C +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FBA4 +ENCODING 64420 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 12 1 3 +BITMAP +60 +80 +60 +80 +00 +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR FBA5 +ENCODING 64421 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 13 0 3 +BITMAP +30 +40 +30 +40 +10 +10 +28 +48 +F8 +E8 +08 +06 +06 +ENDCHAR +STARTCHAR FBA6 +ENCODING 64422 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 7 1 3 +BITMAP +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR FBA7 +ENCODING 64423 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +18 +3C +6E +46 +80 +ENDCHAR +STARTCHAR FBA8 +ENCODING 64424 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +10 +20 +30 +10 +ENDCHAR +STARTCHAR FBA9 +ENCODING 64425 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 7 12 -1 -4 +BITMAP +10 +10 +10 +F6 +DE +18 +10 +00 +08 +10 +08 +08 +ENDCHAR +STARTCHAR FBAA +ENCODING 64426 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 8 -1 3 +BITMAP +08 +1C +1C +26 +27 +19 +FF +E7 +ENDCHAR +STARTCHAR FBAB +ENCODING 64427 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 9 0 4 +BITMAP +10 +10 +28 +48 +F8 +E8 +08 +06 +06 +ENDCHAR +STARTCHAR FBAC +ENCODING 64428 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 8 -1 3 +BITMAP +08 +1C +1C +26 +27 +19 +FF +E7 +ENDCHAR +STARTCHAR FBAD +ENCODING 64429 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 10 -1 -1 +BITMAP +04 +0C +14 +18 +FF +FF +24 +34 +1E +0C +ENDCHAR +STARTCHAR FBAE +ENCODING 64430 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 7 1 0 +BITMAP +0600 +0E00 +3800 +7000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR FBAF +ENCODING 64431 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 9 1 -4 +BITMAP +00FC +07FC +1F00 +3800 +6000 +8000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR FBB0 +ENCODING 64432 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 10 1 0 +BITMAP +0800 +3000 +1800 +2600 +0E00 +3800 +7000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR FBB1 +ENCODING 64433 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 14 1 -4 +BITMAP +0020 +0040 +0020 +0040 +0000 +00FC +07FC +1F00 +3800 +6000 +8000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR FBD3 +ENCODING 64467 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 3 +BITMAP +0C00 +0E40 +0B60 +0860 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR FBD4 +ENCODING 64468 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 3 +BITMAP +0C00 +0E40 +0B60 +0860 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR FBD5 +ENCODING 64469 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 13 -1 3 +BITMAP +30 +0C +23 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FBD6 +ENCODING 64470 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 13 -1 3 +BITMAP +30 +0C +23 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FBD7 +ENCODING 64471 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -2 +BITMAP +03 +03 +03 +03 +04 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBD8 +ENCODING 64472 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -2 +BITMAP +03 +03 +03 +03 +04 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBD9 +ENCODING 64473 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +05 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDA +ENCODING 64474 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +05 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDB +ENCODING 64475 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -1 +BITMAP +02 +02 +02 +02 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDC +ENCODING 64476 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -1 +BITMAP +02 +02 +02 +02 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDD +ENCODING 64477 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 9 16 0 -2 +BITMAP +0C80 +0D00 +0C80 +0D00 +1000 +0300 +0700 +0500 +0500 +0700 +0300 +0100 +0100 +0200 +8600 +7C00 +ENDCHAR +STARTCHAR FBDE +ENCODING 64478 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +04 +07 +0D +0C +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDF +ENCODING 64479 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +04 +07 +0D +0C +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBE0 +ENCODING 64480 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +19 +07 +02 +86 +7C +ENDCHAR +STARTCHAR FBE1 +ENCODING 64481 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +19 +07 +02 +86 +7C +ENDCHAR +STARTCHAR FBE2 +ENCODING 64482 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +02 +05 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBE3 +ENCODING 64483 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +02 +05 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBE4 +ENCODING 64484 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0000 +0400 +0400 +ENDCHAR +STARTCHAR FBE5 +ENCODING 64485 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 9 0 -4 +BITMAP +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +0400 +0400 +ENDCHAR +STARTCHAR FBE6 +ENCODING 64486 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +30 +30 +10 +10 +ENDCHAR +STARTCHAR FBE7 +ENCODING 64487 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +30 +30 +10 +10 +ENDCHAR +STARTCHAR FBFC +ENCODING 64508 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR FBFD +ENCODING 64509 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 7 0 -2 +BITMAP +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +ENDCHAR +STARTCHAR FBFE +ENCODING 64510 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 -1 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +20 +ENDCHAR +STARTCHAR FBFF +ENCODING 64511 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 -1 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +20 +ENDCHAR +STARTCHAR FC5E +ENCODING 64606 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 8 0 12 +BITMAP +10 +30 +50 +F0 +40 +20 +30 +40 +ENDCHAR +STARTCHAR FC5F +ENCODING 64607 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 7 1 12 +BITMAP +40 +60 +80 +60 +80 +60 +80 +ENDCHAR +STARTCHAR FC60 +ENCODING 64608 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 5 1 12 +BITMAP +60 +80 +40 +60 +80 +ENDCHAR +STARTCHAR FC61 +ENCODING 64609 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 7 1 12 +BITMAP +60 +60 +60 +80 +40 +60 +80 +ENDCHAR +STARTCHAR FC62 +ENCODING 64610 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 5 1 12 +BITMAP +40 +60 +80 +60 +80 +ENDCHAR +STARTCHAR FD3E +ENCODING 64830 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 19 1 -4 +BITMAP +10 +10 +20 +60 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +40 +60 +60 +20 +10 +10 +ENDCHAR +STARTCHAR FD3F +ENCODING 64831 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 19 1 -4 +BITMAP +80 +80 +40 +60 +60 +20 +30 +30 +30 +30 +30 +30 +30 +20 +60 +60 +40 +80 +80 +ENDCHAR +STARTCHAR FDF2 +ENCODING 65010 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 13 0 3 +BITMAP +0200 +0000 +0080 +0580 +0600 +0100 +0120 +0920 +1920 +2920 +49A0 +FFE0 +E760 +ENDCHAR +STARTCHAR FE80 +ENCODING 65152 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 8 1 1 +BITMAP +30 +70 +40 +CC +FC +70 +60 +40 +ENDCHAR +STARTCHAR FE81 +ENCODING 65153 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 14 0 2 +BITMAP +F0 +00 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR FE82 +ENCODING 65154 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 13 0 3 +BITMAP +E0 +00 +00 +C0 +40 +40 +40 +40 +40 +40 +40 +30 +30 +ENDCHAR +STARTCHAR FE83 +ENCODING 65155 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 2 +BITMAP +40 +80 +C0 +80 +00 +00 +80 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR FE84 +ENCODING 65156 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 13 0 3 +BITMAP +40 +80 +60 +80 +00 +40 +C0 +40 +40 +40 +40 +70 +30 +ENDCHAR +STARTCHAR FE85 +ENCODING 65157 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +10 +0C +10 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FE86 +ENCODING 65158 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +10 +0C +10 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FE87 +ENCODING 65159 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 16 0 -2 +BITMAP +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +60 +80 +60 +80 +ENDCHAR +STARTCHAR FE88 +ENCODING 65160 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 15 0 -1 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +30 +30 +00 +40 +80 +60 +80 +ENDCHAR +STARTCHAR FE89 +ENCODING 65161 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 12 0 -1 +BITMAP +2000 +4000 +6060 +40F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR FE8A +ENCODING 65162 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 -2 +BITMAP +2000 +4000 +6000 +4000 +0000 +0000 +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +ENDCHAR +STARTCHAR FE8B +ENCODING 65163 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +20 +10 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE8C +ENCODING 65164 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +20 +10 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE8D +ENCODING 65165 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 11 1 3 +BITMAP +80 +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR FE8E +ENCODING 65166 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 10 0 4 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +30 +30 +ENDCHAR +STARTCHAR FE8F +ENCODING 65167 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 0 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0600 +0600 +ENDCHAR +STARTCHAR FE90 +ENCODING 65168 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 0 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0600 +0600 +ENDCHAR +STARTCHAR FE91 +ENCODING 65169 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 9 -1 0 +BITMAP +08 +08 +0C +04 +FC +FC +00 +10 +10 +ENDCHAR +STARTCHAR FE92 +ENCODING 65170 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 9 -1 0 +BITMAP +08 +08 +0C +04 +FC +FC +00 +10 +10 +ENDCHAR +STARTCHAR FE93 +ENCODING 65171 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 11 0 3 +BITMAP +10 +D0 +C0 +00 +20 +30 +78 +48 +48 +78 +70 +ENDCHAR +STARTCHAR FE94 +ENCODING 65172 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 14 0 3 +BITMAP +10 +50 +40 +00 +00 +10 +10 +28 +48 +F8 +E8 +08 +06 +06 +ENDCHAR +STARTCHAR FE95 +ENCODING 65173 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 3 +BITMAP +0300 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FE96 +ENCODING 65174 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 3 +BITMAP +0300 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FE97 +ENCODING 65175 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 3 +BITMAP +08 +28 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE98 +ENCODING 65176 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 3 +BITMAP +08 +28 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE99 +ENCODING 65177 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 10 1 3 +BITMAP +0400 +0700 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FE9A +ENCODING 65178 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 10 1 3 +BITMAP +0400 +0700 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FE9B +ENCODING 65179 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +20 +28 +28 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE9C +ENCODING 65180 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +20 +28 +28 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE9D +ENCODING 65181 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8600 +8600 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FE9E +ENCODING 65182 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8000 +8400 +8400 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FE9F +ENCODING 65183 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 9 -1 0 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0400 +0400 +ENDCHAR +STARTCHAR FEA0 +ENCODING 65184 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 9 -1 0 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0400 +0400 +ENDCHAR +STARTCHAR FEA1 +ENCODING 65185 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FEA2 +ENCODING 65186 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FEA3 +ENCODING 65187 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 6 -1 3 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR FEA4 +ENCODING 65188 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 6 -1 3 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR FEA5 +ENCODING 65189 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0400 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FEA6 +ENCODING 65190 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 16 0 -4 +BITMAP +0400 +0400 +0000 +0000 +3F80 +7F80 +0E00 +31C0 +41C0 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FEA7 +ENCODING 65191 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 3 +BITMAP +0400 +0400 +0000 +0000 +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR FEA8 +ENCODING 65192 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 3 +BITMAP +0400 +0400 +0000 +0000 +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR FEA9 +ENCODING 65193 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 8 1 3 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEAA +ENCODING 65194 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 8 1 3 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEAB +ENCODING 65195 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +40 +60 +00 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEAC +ENCODING 65196 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +40 +60 +00 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEAD +ENCODING 65197 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 1 -2 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FEAE +ENCODING 65198 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 1 -2 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FEAF +ENCODING 65199 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -2 +BITMAP +04 +04 +00 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FEB0 +ENCODING 65200 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -2 +BITMAP +04 +04 +00 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FEB1 +ENCODING 65201 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 9 1 -1 +BITMAP +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR FEB2 +ENCODING 65202 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 9 1 -1 +BITMAP +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR FEB3 +ENCODING 65203 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 5 -1 3 +BITMAP +0020 +10A0 +08A0 +FFE0 +FF60 +ENDCHAR +STARTCHAR FEB4 +ENCODING 65204 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 5 -1 3 +BITMAP +0020 +10A0 +08A0 +FFE0 +FF60 +ENDCHAR +STARTCHAR FEB5 +ENCODING 65205 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 -1 +BITMAP +0030 +0038 +0028 +0020 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR FEB6 +ENCODING 65206 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 -1 +BITMAP +0030 +0038 +0028 +0020 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR FEB7 +ENCODING 65207 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 3 +BITMAP +0100 +01C0 +0340 +0300 +0000 +0020 +10A0 +08A0 +FFE0 +FF60 +ENDCHAR +STARTCHAR FEB8 +ENCODING 65208 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 3 +BITMAP +0100 +01C0 +0340 +0300 +0000 +0020 +10A0 +08A0 +FFE0 +FF60 +ENDCHAR +STARTCHAR FEB9 +ENCODING 65209 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 9 1 -1 +BITMAP +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR FEBA +ENCODING 65210 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 9 1 -1 +BITMAP +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR FEBB +ENCODING 65211 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 6 -1 3 +BITMAP +000700 +001F80 +103180 +08C180 +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR FEBC +ENCODING 65212 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 6 -1 3 +BITMAP +000700 +001F80 +103180 +08C180 +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR FEBD +ENCODING 65213 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 12 1 -1 +BITMAP +000800 +000800 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR FEBE +ENCODING 65214 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 12 1 -1 +BITMAP +000800 +000800 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR FEBF +ENCODING 65215 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 9 -1 3 +BITMAP +006000 +006000 +000000 +000700 +001F80 +103180 +08C180 +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR FEC0 +ENCODING 65216 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 9 -1 3 +BITMAP +006000 +006000 +000000 +000700 +001F80 +103180 +08C180 +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR FEC1 +ENCODING 65217 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC2 +ENCODING 65218 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC3 +ENCODING 65219 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC4 +ENCODING 65220 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC5 +ENCODING 65221 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC6 +ENCODING 65222 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC7 +ENCODING 65223 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC8 +ENCODING 65224 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC9 +ENCODING 65225 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 0 -4 +BITMAP +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR FECA +ENCODING 65226 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 9 13 0 -4 +BITMAP +1C00 +3C00 +1C00 +3C00 +2780 +4380 +4000 +8000 +4000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FECB +ENCODING 65227 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 6 -1 3 +BITMAP +1E00 +3F00 +2040 +3380 +FF00 +FC00 +ENDCHAR +STARTCHAR FECC +ENCODING 65228 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 6 -1 3 +BITMAP +1E +3E +3E +0C +FF +E3 +ENDCHAR +STARTCHAR FECD +ENCODING 65229 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 20 0 -4 +BITMAP +1000 +1000 +0000 +0000 +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR FECE +ENCODING 65230 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 9 17 0 -4 +BITMAP +0800 +0800 +0000 +0000 +1C00 +3C00 +1C00 +3C00 +2780 +4380 +4000 +8000 +4000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FECF +ENCODING 65231 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 9 -1 3 +BITMAP +0C00 +0C00 +0000 +1E00 +3F00 +2040 +3380 +FF00 +FC00 +ENDCHAR +STARTCHAR FED0 +ENCODING 65232 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 10 -1 3 +BITMAP +08 +08 +00 +00 +1E +3E +3E +0C +FF +E3 +ENDCHAR +STARTCHAR FED1 +ENCODING 65233 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 10 0 3 +BITMAP +0018 +0018 +0000 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FED2 +ENCODING 65234 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 10 0 3 +BITMAP +0018 +0018 +0000 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FED3 +ENCODING 65235 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +10 +00 +18 +38 +2C +3C +3C +04 +FC +FC +ENDCHAR +STARTCHAR FED4 +ENCODING 65236 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 3 +BITMAP +08 +08 +00 +00 +18 +1C +24 +24 +1C +0C +FC +FC +ENDCHAR +STARTCHAR FED5 +ENCODING 65237 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -1 +BITMAP +0100 +0580 +0400 +0000 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR FED6 +ENCODING 65238 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -1 +BITMAP +0100 +0580 +0400 +0000 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR FED7 +ENCODING 65239 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 3 +BITMAP +08 +28 +20 +00 +18 +38 +2C +3C +3C +04 +FC +FC +ENDCHAR +STARTCHAR FED8 +ENCODING 65240 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +08 +28 +20 +00 +00 +18 +1C +24 +24 +1C +0C +FC +FC +ENDCHAR +STARTCHAR FED9 +ENCODING 65241 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 12 0 3 +BITMAP +0040 +0060 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR FEDA +ENCODING 65242 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 12 0 3 +BITMAP +0040 +0060 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR FEDB +ENCODING 65243 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 11 -1 3 +BITMAP +03 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FEDC +ENCODING 65244 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 11 -1 3 +BITMAP +03 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FEDD +ENCODING 65245 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 0 +BITMAP +0200 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR FEDE +ENCODING 65246 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 0 +BITMAP +0200 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR FEDF +ENCODING 65247 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 12 -1 3 +BITMAP +20 +38 +10 +10 +10 +10 +10 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEE0 +ENCODING 65248 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 12 -1 3 +BITMAP +20 +38 +10 +10 +10 +10 +10 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEE1 +ENCODING 65249 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 11 0 -4 +BITMAP +38 +3C +0C +3C +7C +C0 +80 +80 +40 +40 +40 +ENDCHAR +STARTCHAR FEE2 +ENCODING 65250 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 11 0 -4 +BITMAP +38 +3C +0C +3C +7C +C0 +80 +80 +40 +40 +40 +ENDCHAR +STARTCHAR FEE3 +ENCODING 65251 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 5 -1 3 +BITMAP +02 +0D +1D +FF +F7 +ENDCHAR +STARTCHAR FEE4 +ENCODING 65252 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 5 -1 3 +BITMAP +02 +0D +1D +FF +F7 +ENDCHAR +STARTCHAR FEE5 +ENCODING 65253 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 -1 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FEE6 +ENCODING 65254 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 -1 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FEE7 +ENCODING 65255 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 9 -1 3 +BITMAP +10 +10 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FEE8 +ENCODING 65256 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 9 -1 3 +BITMAP +10 +10 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FEE9 +ENCODING 65257 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 7 1 3 +BITMAP +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR FEEA +ENCODING 65258 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 9 0 4 +BITMAP +10 +10 +28 +48 +F8 +E8 +08 +06 +06 +ENDCHAR +STARTCHAR FEEB +ENCODING 65259 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 8 -1 3 +BITMAP +08 +1C +1C +26 +27 +19 +FF +E7 +ENDCHAR +STARTCHAR FEEC +ENCODING 65260 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 10 -1 -1 +BITMAP +04 +0C +14 +18 +FF +FF +24 +34 +1E +0C +ENDCHAR +STARTCHAR FEED +ENCODING 65261 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FEEE +ENCODING 65262 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FEEF +ENCODING 65263 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR FEF0 +ENCODING 65264 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 7 0 -2 +BITMAP +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +ENDCHAR +STARTCHAR FEF1 +ENCODING 65265 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0300 +0B00 +0800 +ENDCHAR +STARTCHAR FEF2 +ENCODING 65266 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 9 0 -4 +BITMAP +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +0A00 +0A00 +ENDCHAR +STARTCHAR FEF3 +ENCODING 65267 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 -1 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +20 +ENDCHAR +STARTCHAR FEF4 +ENCODING 65268 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 -1 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +20 +ENDCHAR +STARTCHAR FEF5 +ENCODING 65269 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 1 +BITMAP +E000 +0000 +8200 +C380 +E100 +6100 +1100 +0A00 +0A00 +0600 +0400 +0600 +1A00 +1E00 +1C00 +ENDCHAR +STARTCHAR FEF6 +ENCODING 65270 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 13 1 3 +BITMAP +E000 +0000 +C000 +F100 +7900 +0500 +0280 +0080 +0180 +0280 +0680 +3CC0 +F840 +ENDCHAR +STARTCHAR FEF7 +ENCODING 65271 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 15 0 1 +BITMAP +6000 +8000 +6100 +81C0 +0080 +4080 +6080 +3080 +0900 +0500 +0300 +0200 +0500 +0F00 +0E00 +ENDCHAR +STARTCHAR FEF8 +ENCODING 65272 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 13 1 3 +BITMAP +4000 +8000 +C000 +8100 +E100 +7900 +0480 +0280 +0180 +0280 +0680 +3CC0 +F840 +ENDCHAR +STARTCHAR FEF9 +ENCODING 65273 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 18 1 -4 +BITMAP +8200 +C380 +E100 +6100 +1100 +0A00 +0A00 +0600 +0400 +0600 +1A00 +1E00 +1C00 +0000 +1000 +2000 +1800 +2000 +ENDCHAR +STARTCHAR FEFA +ENCODING 65274 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 16 1 -2 +BITMAP +C000 +F100 +7900 +0500 +0280 +0080 +0180 +0280 +0680 +3CC0 +F840 +0000 +2000 +4000 +6000 +4000 +ENDCHAR +STARTCHAR FEFB +ENCODING 65275 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 1 1 +BITMAP +8200 +C380 +E100 +6100 +1100 +0A00 +0A00 +0600 +0400 +0600 +1A00 +1E00 +1C00 +ENDCHAR +STARTCHAR FEFC +ENCODING 65276 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 11 1 3 +BITMAP +C000 +F100 +7900 +0500 +0280 +0080 +0180 +0280 +0680 +3CC0 +F840 +ENDCHAR +STARTCHAR FFFC +ENCODING 65532 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 19 14 0 0 +BITMAP +E71CE0 +800020 +800020 +000000 +1EF980 +B3C9A0 +A1F1A0 +A1C9A0 +B3C920 +1EFF00 +000000 +800020 +800020 +E71CE0 +ENDCHAR +ENDFONT diff --git a/Gravity_Falls_Memory_Gun/code.py b/Gravity_Falls_Memory_Gun/code.py new file mode 100644 index 000000000..aeecbbe91 --- /dev/null +++ b/Gravity_Falls_Memory_Gun/code.py @@ -0,0 +1,107 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import os +import board +import audiocore +import audiobusio +from digitalio import DigitalInOut, Direction +import displayio +from adafruit_bitmap_font import bitmap_font +from adafruit_display_text import label +import adafruit_displayio_ssd1306 +from adafruit_seesaw import seesaw, rotaryio +import vectorio +import keypad + +#display setup +displayio.release_displays() +# enable external power pin +# provides power to the external components +external_power = DigitalInOut(board.EXTERNAL_POWER) +external_power.direction = Direction.OUTPUT +external_power.value = False + +# rotary encoder +i2c = board.STEMMA_I2C() +seesaw = seesaw.Seesaw(i2c, addr=0x36) +encoder = rotaryio.IncrementalEncoder(seesaw) +last_position = 0 + +# oled +oled_reset = board.D9 +display_bus = displayio.I2CDisplay(i2c, device_address=0x3D, reset=oled_reset) +WIDTH = 128 +HEIGHT = 64 +display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=WIDTH, height=HEIGHT) + +# trigger button +switch = keypad.Keys((board.EXTERNAL_BUTTON,), value_when_pressed=False, pull=True) + +# audio! +wavs = [] +wav_names = [] +for filename in os.listdir('/wavs'): + if filename.lower().endswith('.wav') and not filename.startswith('.'): + wavs.append("/wavs/"+filename) + wav_names.append(filename.replace('.wav', '')) +audio = audiobusio.I2SOut(board.I2S_BIT_CLOCK, board.I2S_WORD_SELECT, board.I2S_DATA) +num_wavs = len(wavs) +wav_index = 0 +# function to open and play the audio files +def open_audio(num): + n = wavs[num] + f = open(n, "rb") + w = audiocore.WaveFile(f) + return w +wave = open_audio(wav_index) +audio.play(wave) + +# make the display context +splash = displayio.Group() +display.root_group = splash +palette = displayio.Palette(1) +palette[0] = 0xFFFFFF +rect = vectorio.Rectangle(pixel_shader=palette, width=display.width, height=23, x=6, y=21) +splash.append(rect) +font = bitmap_font.load_font("/Arial-14.bdf") +color = 0xFFFFFF +text_0 = wav_names[(wav_index - 1) % num_wavs] +text_area_top_left = label.Label(font, text=text_0, color=color) +text_area_top_left.anchor_point = (0.0, 0.0) +text_area_top_left.anchored_position = (6, 0) +splash.append(text_area_top_left) + +text_1 = wav_names[wav_index] +text_area_middle_left = label.Label(font, text=text_1,color=0x000000) +text_area_middle_left.anchor_point = (0.0, 0.5) +text_area_middle_left.anchored_position = (6, display.height / 2) +splash.append(text_area_middle_left) + +text_2 = wav_names[(wav_index+1) % num_wavs] +text_area_bottom_left = label.Label(font, text=text_2, color=color) +text_area_bottom_left.anchor_point = (0.0, 1.0) +text_area_bottom_left.anchored_position = (6, display.height) +splash.append(text_area_bottom_left) + +while True: + + event = switch.events.get() + position = encoder.position + if position != last_position: + if position > last_position: + wav_index = (wav_index + 1) % num_wavs + else: + wav_index = (wav_index - 1) % num_wavs + text_area_top_left.text = wav_names[(wav_index-1) % num_wavs] + text_area_middle_left.text = wav_names[wav_index] + text_area_bottom_left.text = wav_names[(wav_index+1) % num_wavs] + last_position = position + if event: + if event.pressed: + external_power.value = True + wave = open_audio(wav_index) + audio.play(wave) + if event.released: + external_power.value = False diff --git a/Gravity_Falls_Memory_Gun/wavs/Blast Charge.wav b/Gravity_Falls_Memory_Gun/wavs/Blast Charge.wav new file mode 100644 index 000000000..c12124e20 Binary files /dev/null and b/Gravity_Falls_Memory_Gun/wavs/Blast Charge.wav differ diff --git a/Gravity_Falls_Memory_Gun/wavs/Electric Boom.wav b/Gravity_Falls_Memory_Gun/wavs/Electric Boom.wav new file mode 100644 index 000000000..e23086135 Binary files /dev/null and b/Gravity_Falls_Memory_Gun/wavs/Electric Boom.wav differ diff --git a/Gravity_Falls_Memory_Gun/wavs/Pulse Wave.wav b/Gravity_Falls_Memory_Gun/wavs/Pulse Wave.wav new file mode 100644 index 000000000..37d61f257 Binary files /dev/null and b/Gravity_Falls_Memory_Gun/wavs/Pulse Wave.wav differ diff --git a/Gravity_Falls_Memory_Gun/wavs/Signal Drop.wav b/Gravity_Falls_Memory_Gun/wavs/Signal Drop.wav new file mode 100644 index 000000000..069c1ce04 Binary files /dev/null and b/Gravity_Falls_Memory_Gun/wavs/Signal Drop.wav differ diff --git a/Gravity_Falls_Memory_Gun/wavs/Sonic Glitch.wav b/Gravity_Falls_Memory_Gun/wavs/Sonic Glitch.wav new file mode 100644 index 000000000..4c9ad046f Binary files /dev/null and b/Gravity_Falls_Memory_Gun/wavs/Sonic Glitch.wav differ diff --git a/Gravity_Falls_Memory_Gun/wavs/Static Fizz.wav b/Gravity_Falls_Memory_Gun/wavs/Static Fizz.wav new file mode 100644 index 000000000..9fb38c44e Binary files /dev/null and b/Gravity_Falls_Memory_Gun/wavs/Static Fizz.wav differ diff --git a/Gravity_Falls_Memory_Gun/wavs/Static Spark.wav b/Gravity_Falls_Memory_Gun/wavs/Static Spark.wav new file mode 100644 index 000000000..b526ca945 Binary files /dev/null and b/Gravity_Falls_Memory_Gun/wavs/Static Spark.wav differ diff --git a/Gravity_Falls_Memory_Gun/wavs/Warp Implode.wav b/Gravity_Falls_Memory_Gun/wavs/Warp Implode.wav new file mode 100644 index 000000000..2d00dd4d2 Binary files /dev/null and b/Gravity_Falls_Memory_Gun/wavs/Warp Implode.wav differ diff --git a/Gravity_Falls_Memory_Gun/wavs/Wobble Wave.wav b/Gravity_Falls_Memory_Gun/wavs/Wobble Wave.wav new file mode 100644 index 000000000..fc05217cb Binary files /dev/null and b/Gravity_Falls_Memory_Gun/wavs/Wobble Wave.wav differ diff --git a/Gravity_Falls_Memory_Gun/wavs/Zap Shock.wav b/Gravity_Falls_Memory_Gun/wavs/Zap Shock.wav new file mode 100644 index 000000000..e87188082 Binary files /dev/null and b/Gravity_Falls_Memory_Gun/wavs/Zap Shock.wav differ diff --git a/Grill_Thermometer_Dashboard/code.py b/Grill_Thermometer_Dashboard/code.py new file mode 100644 index 000000000..8720c0f8f --- /dev/null +++ b/Grill_Thermometer_Dashboard/code.py @@ -0,0 +1,115 @@ +# SPDX-FileCopyrightText: 2024 johnpark for Adafruit Industries +# +# SPDX-License-Identifier: MIT +''' +BLE BBQ Thermometer to WiFi to Adafruit IO Dashboard +Feather ESP32-S3 8MB No PSRAM +''' +import os +import time +import adafruit_connection_manager +import wifi +import adafruit_minimqtt.adafruit_minimqtt as MQTT +import adafruit_ble +from adafruit_ble.advertising.standard import ProvideServicesAdvertisement +from adafruit_ble_ibbq import IBBQService + + +aio_username = os.getenv("aio_username") +aio_key = os.getenv("aio_key") + +print(f"Connecting to {os.getenv('CIRCUITPY_WIFI_SSID')}") +wifi.radio.connect( + os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD") +) +print(f"Connected to {os.getenv('CIRCUITPY_WIFI_SSID')}") + +### Feeds ### +feeds = [aio_username + f"/feeds/bbq{i}" for i in range(1, 7)] +battery_feed = aio_username + "/feeds/bbq_battery" + +# Define callback methods which are called when events occur +# pylint: disable=unused-argument, redefined-outer-name +def connected(client, userdata, flags, rc): + print("Connected to Adafruit IO") + +def disconnected(client, userdata, rc): + print("Disconnected from Adafruit IO") + +# Create a socket pool +pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio) +ssl_context = adafruit_connection_manager.get_radio_ssl_context(wifi.radio) +connection_manager = adafruit_connection_manager.get_connection_manager(pool) + +# Set up a MiniMQTT Client +mqtt_client = MQTT.MQTT( + broker="io.adafruit.com", + port=1883, + username=aio_username, + password=aio_key, + socket_pool=pool, + ssl_context=ssl_context, +) + +# Setup the callback methods above +mqtt_client.on_connect = connected +mqtt_client.on_disconnect = disconnected + +# Connect the client to the MQTT broker. +print("Connecting to Adafruit IO...") +mqtt_client.connect() + +# PyLint can't find BLERadio for some reason so special case it here. +ble = adafruit_ble.BLERadio() # pylint: disable=no-member + +ibbq_connection = None +battery_percentage = 100 + +def c_to_f(temp_c): + return (temp_c * 9/5) + 32 + +def volt_to_percent(voltage, max_voltage): + return (voltage / max_voltage) * 100 + +def probe_check(temp): # if value is wildly high no probe is connected + return temp if temp <= 11000 else 0 + +battery_val = 3.3 + + +while True: + print("Scanning...") + for adv in ble.start_scan(ProvideServicesAdvertisement, timeout=5): + if IBBQService in adv.services: + print("found an IBBq advertisement") + ibbq_connection = ble.connect(adv) + print("Connected") + break + + # Stop scanning whether or not we are connected. + ble.stop_scan() + + if ibbq_connection and ibbq_connection.connected: + ibbq_service = ibbq_connection[IBBQService] + ibbq_service.init() + while ibbq_connection.connected: + print( + "Temperatures:", + ibbq_service.temperatures, + "; Battery:", + ibbq_service.battery_level, + ) + + grill_vals = [probe_check(c_to_f(temp)) for temp in ibbq_service.temperatures] + battery_val, battery_max = ibbq_service.battery_level + battery_percentage = (volt_to_percent(battery_val, 3.3)) + + mqtt_client.loop(timeout=1) + + for feed, val in zip(feeds, grill_vals): + print(f"Sending grill value: {val} to {feed}...") + mqtt_client.publish(feed, val) + + mqtt_client.publish(battery_feed, battery_percentage) + print("Sent") + time.sleep(5) diff --git a/HID_Reporter/USB_Host_HID_Reporter/.feather_esp32s2_tft.test.only b/HID_Reporter/USB_Host_HID_Reporter/.feather_esp32s2_tft.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/HID_Reporter/USB_Host_HID_Reporter/.theia/launch.json b/HID_Reporter/USB_Host_HID_Reporter/.theia/launch.json new file mode 100644 index 000000000..a2ea02c46 --- /dev/null +++ b/HID_Reporter/USB_Host_HID_Reporter/.theia/launch.json @@ -0,0 +1,6 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + "version": "0.2.0", + "configurations": [] +} diff --git a/HID_Reporter/USB_Host_HID_Reporter/USB_Host_HID_Reporter.ino b/HID_Reporter/USB_Host_HID_Reporter/USB_Host_HID_Reporter.ino new file mode 100644 index 000000000..cb3bbfa5d --- /dev/null +++ b/HID_Reporter/USB_Host_HID_Reporter/USB_Host_HID_Reporter.ino @@ -0,0 +1,123 @@ +// SPDX-FileCopyrightText: 2024 John Park for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/********************************************************************* + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + MIT license, check LICENSE for more information + Copyright (c) 2024 John Park for Adafruit Industries + Copyright (c) 2019 Ha Thach for Adafruit Industries + All text above, and the splash screen below must be included in + any redistribution +*********************************************************************/ + +/* Keyboard HID Keycode Reporter + * - Device runs on native usb controller (roothub port0) + * - esp32-s2 TFT Feather : using MAX3421e controller featherwing + * - SPI instance, CS pin, INT pin are correctly configured in usbh_helper.h + */ + +// USBHost is defined in usbh_helper.h +#include "usbh_helper.h" +#include +#include +#include +#include + +Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); + +void setup() { + Serial.begin(115200); + // turn on backlight + pinMode(TFT_BACKLITE, OUTPUT); + digitalWrite(TFT_BACKLITE, HIGH); + + // turn on the TFT / I2C power supply + pinMode(TFT_I2C_POWER, OUTPUT); + digitalWrite(TFT_I2C_POWER, HIGH); + delay(10); + + // initialize TFT + tft.init(135, 240); // Init ST7789 240x135 + tft.setRotation(3); + tft.fillScreen(ST77XX_BLACK); + + tft.setFont(&FreeMono18pt7b); + tft.setTextWrap(true); + tft.fillScreen(ST77XX_BLACK); + tft.setCursor(0, 20); + tft.setTextColor(ST77XX_GREEN); + tft.setTextSize(1); + tft.println("HIDreporter"); + + // init host stack on controller (rhport) 1 + USBHost.begin(1); + +// while ( !Serial ) delay(10); // wait for native usb + Serial.println("TinyUSB Dual: HID Device Reporter"); +} + +void loop() { + USBHost.task(); + Serial.flush(); +} + +extern "C" { + +// Invoked when device with hid interface is mounted +// Report descriptor is also available for use. +// tuh_hid_parse_report_descriptor() can be used to parse common/simple enough +// descriptor. Note: if report descriptor length > CFG_TUH_ENUMERATION_BUFSIZE, +// it will be skipped therefore report_desc = NULL, desc_len = 0 +void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *desc_report, uint16_t desc_len) { + (void) desc_report; + (void) desc_len; + uint16_t vid, pid; + tuh_vid_pid_get(dev_addr, &vid, &pid); + + Serial.printf("HID device address = %d, instance = %d is mounted\r\n", dev_addr, instance); + Serial.printf("VID = %04x, PID = %04x\r\n", vid, pid); + tft.fillRect(0, 34, 240, 80, ST77XX_BLACK); + tft.setFont(&FreeMono12pt7b); + tft.setCursor(0, 50); + tft.printf("VID=%04x,PID=%04x\r\n", vid, pid); + if (!tuh_hid_receive_report(dev_addr, instance)) { + Serial.printf("Error: cannot request to receive report\r\n"); + } +} + +// Invoked when device with hid interface is un-mounted +void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) { + Serial.printf("HID device address = %d, instance = %d is unmounted\r\n", dev_addr, instance); + tft.fillRect(0, 34, 240, 140, ST77XX_BLACK); + tft.setFont(&FreeMono12pt7b); + tft.setTextColor(ST77XX_YELLOW); + tft.setCursor(0, 50); + tft.printf("-- unmounted --"); + tft.setTextColor(ST77XX_GREEN); + +} + +// Invoked when received report from device via interrupt endpoint +void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len) { + Serial.printf("HIDreport : "); + tft.fillRect(0, 64, 240, 80, ST77XX_BLACK); + tft.setCursor(0, 88); + tft.setFont(&FreeMono18pt7b); + + for (uint16_t i = 0; i < len; i++) { + Serial.printf("0x%02X ", report[i]); + tft.printf("%02X ", report[i]); + } + + Serial.println(); + // continue to request to receive report + if (!tuh_hid_receive_report(dev_addr, instance)) { + Serial.printf("Error: cannot request to receive report\r\n"); + } +} + +} // extern C diff --git a/HID_Reporter/USB_Host_HID_Reporter/usbh_helper.h b/HID_Reporter/USB_Host_HID_Reporter/usbh_helper.h new file mode 100644 index 000000000..eb65574f2 --- /dev/null +++ b/HID_Reporter/USB_Host_HID_Reporter/usbh_helper.h @@ -0,0 +1,102 @@ +// SPDX-FileCopyrightText: 2024 John Park for Adafruit Industries +// +// SPDX-License-Identifier: MIT +/********************************************************************* + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + MIT license, check LICENSE for more information + Copyright (c) 2019 Ha Thach for Adafruit Industries + All text above, and the splash screen below must be included in + any redistribution +*********************************************************************/ + +#ifndef USBH_HELPER_H +#define USBH_HELPER_H + +#ifdef ARDUINO_ARCH_RP2040 + // pio-usb is required for rp2040 host + #include "pio_usb.h" + + // Pin D+ for host, D- = D+ + 1 + #ifndef PIN_USB_HOST_DP + #define PIN_USB_HOST_DP 16 + #endif + + // Pin for enabling Host VBUS. comment out if not used + #ifndef PIN_5V_EN + #define PIN_5V_EN 18 + #endif + + #ifndef PIN_5V_EN_STATE + #define PIN_5V_EN_STATE 1 + #endif +#endif // ARDUINO_ARCH_RP2040 + +#include "Adafruit_TinyUSB.h" + +#if defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421 + // USB Host using MAX3421E: SPI, CS, INT + #include "SPI.h" + + #if defined(ARDUINO_METRO_ESP32S2) + Adafruit_USBH_Host USBHost(&SPI, 15, 14); + #elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32_V2) + Adafruit_USBH_Host USBHost(&SPI, 33, 15); + #else + // Default CS and INT are pin 10, 9 + Adafruit_USBH_Host USBHost(&SPI, 10, 9); + #endif +#else + // Native USB Host such as rp2040 + Adafruit_USBH_Host USBHost; +#endif + +//--------------------------------------------------------------------+ +// Helper Functions +//--------------------------------------------------------------------+ + +#ifdef ARDUINO_ARCH_RP2040 +static void rp2040_configure_pio_usb(void) { + //while ( !Serial ) delay(10); // wait for native usb + Serial.println("Core1 setup to run TinyUSB host with pio-usb"); + + // Check for CPU frequency, must be multiple of 120Mhz for bit-banging USB + uint32_t cpu_hz = clock_get_hz(clk_sys); + if (cpu_hz != 120000000UL && cpu_hz != 240000000UL) { + while (!Serial) { + delay(10); // wait for native usb + } + Serial.printf("Error: CPU Clock = %lu, PIO USB require CPU clock must be multiple of 120 Mhz\r\n", cpu_hz); + Serial.printf("Change your CPU Clock to either 120 or 240 Mhz in Menu->CPU Speed \r\n"); + while (1) { + delay(1); + } + } + +#ifdef PIN_5V_EN + pinMode(PIN_5V_EN, OUTPUT); + digitalWrite(PIN_5V_EN, PIN_5V_EN_STATE); +#endif + + pio_usb_configuration_t pio_cfg = PIO_USB_DEFAULT_CONFIG; + pio_cfg.pin_dp = PIN_USB_HOST_DP; + +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) + // For pico-w, PIO is also used to communicate with cyw43 + // Therefore we need to alternate the pio-usb configuration + // details https://github.com/sekigon-gonnoc/Pico-PIO-USB/issues/46 + pio_cfg.sm_tx = 3; + pio_cfg.sm_rx = 2; + pio_cfg.sm_eop = 3; + pio_cfg.pio_rx_num = 0; + pio_cfg.pio_tx_num = 1; + pio_cfg.tx_ch = 9; +#endif + + USBHost.configure_pio_usb(1, &pio_cfg); +} +#endif + +#endif diff --git a/HSTX_to_DVI_Breakout_Example/code.py b/HSTX_to_DVI_Breakout_Example/code.py new file mode 100644 index 000000000..7893647ff --- /dev/null +++ b/HSTX_to_DVI_Breakout_Example/code.py @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: 2024 Scott Shawcroft for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import board +import picodvi +import framebufferio +import displayio + +displayio.release_displays() + +fb = picodvi.Framebuffer(320, 240, clk_dp=board.CKP, clk_dn=board.CKN, + red_dp=board.D0P, red_dn=board.D0N, + green_dp=board.D1P, green_dn=board.D1N, + blue_dp=board.D2P, blue_dn=board.D2N, + color_depth=16) +display = framebufferio.FramebufferDisplay(fb) + +# Initialize the display in the display variable +ruler = displayio.OnDiskBitmap("/display-ruler-rgb-720p.bmp") + +t = displayio.TileGrid(ruler, pixel_shader=ruler.pixel_shader) + +g = displayio.Group() +g.append(t) + +display.root_group = g + +display.refresh() + +while True: + pass diff --git a/HSTX_to_DVI_Breakout_Example/display-ruler-rgb-720p.bmp b/HSTX_to_DVI_Breakout_Example/display-ruler-rgb-720p.bmp new file mode 100644 index 000000000..f73b1c3c2 Binary files /dev/null and b/HSTX_to_DVI_Breakout_Example/display-ruler-rgb-720p.bmp differ diff --git a/Hallowing_Jump_Sound/jump-sound/code.py b/Hallowing_Jump_Sound/jump-sound/code.py index 4a1e819d3..e68911e84 100755 --- a/Hallowing_Jump_Sound/jump-sound/code.py +++ b/Hallowing_Jump_Sound/jump-sound/code.py @@ -74,8 +74,21 @@ TOUCH4 = touchio.TouchIn(board.TOUCH4) i2c = board.I2C() # uses board.SCL and board.SDA # i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller if IS_HALLOWING_M4: - import adafruit_msa301 - ACCEL = adafruit_msa301.MSA301(i2c) + # i2c scan to determine which accelo + while not i2c.try_lock(): + pass + ADDR = i2c.scan() + i2c.unlock() + if 0x26 in ADDR: + # MSA301 + from adafruit_msa3xx import MSA301 + ACCEL = MSA301(i2c) + elif 0x62 in ADDR: + # MSA311 + from adafruit_msa3xx import MSA311 + ACCEL = MSA311(i2c) + else: + raise RuntimeError("Accelerometer not found.") else: import adafruit_lis3dh try: diff --git a/Hallowing_Jump_Sound/stomp-and-roar/code.py b/Hallowing_Jump_Sound/stomp-and-roar/code.py index fdbe94121..96895e438 100755 --- a/Hallowing_Jump_Sound/stomp-and-roar/code.py +++ b/Hallowing_Jump_Sound/stomp-and-roar/code.py @@ -57,8 +57,21 @@ except AttributeError: i2c = board.I2C() # uses board.SCL and board.SDA # i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller if IS_HALLOWING_M4: - import adafruit_msa301 - ACCEL = adafruit_msa301.MSA301(i2c) + # i2c scan to determine which accelo + while not i2c.try_lock(): + pass + ADDR = i2c.scan() + i2c.unlock() + if 0x26 in ADDR: + # MSA301 + from adafruit_msa3xx import MSA301 + ACCEL = MSA301(i2c) + elif 0x62 in ADDR: + # MSA311 + from adafruit_msa3xx import MSA311 + ACCEL = MSA311(i2c) + else: + raise RuntimeError("Accelerometer not found.") else: import adafruit_lis3dh try: diff --git a/Halo_Energy_Sword/code.py b/Halo_Energy_Sword/code.py new file mode 100644 index 000000000..c5c1d70bc --- /dev/null +++ b/Halo_Energy_Sword/code.py @@ -0,0 +1,215 @@ +# SPDX-FileCopyrightText: 2019 Kattni Rembor for Adafruit Industries +# SPDX-FileCopyrightText: 2019 Limor Fried for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +""" +RP2040 Prop-Maker Feather Energy Sword +Adafruit invests time and resources providing this open source code. +Please support Adafruit and open source hardware by purchasing +products from Adafruit! +Written by Kattni Rembor & Limor Fried for Adafruit Industries +Copyright (c) 2019-2020 Adafruit Industries +Licensed under the MIT license. +All text above must be included in any redistribution. +""" + +import time +import random +import digitalio +import audiocore +import audiobusio +import board +import neopixel +import adafruit_lis3dh + +# CUSTOMISE COLORS HERE: +COLOR = (0, 120, 120) # Default idle is light blue +ALT_COLOR = (255, 0, 250) # hit color is purple + +# CUSTOMISE IDLE PULSE SPEED HERE: 0 is fast, above 0 slows down +IDLE_PULSE_SPEED = 0 # Default is 0 seconds +SWING_BLAST_SPEED = 0.0007 + +# CUSTOMISE BRIGHTNESS HERE: must be a number between 0 and 1 +IDLE_PULSE_BRIGHTNESS_MIN = 0.2 # Default minimum idle pulse brightness +IDLE_PULSE_BRIGHTNESS_MAX = 1 # Default maximum idle pulse brightness + +# CUSTOMISE SENSITIVITY HERE: smaller numbers = more sensitive to motion +HIT_THRESHOLD = 250 +SWING_THRESHOLD = 150 + +# Set to the length in seconds of the "on.wav" file +POWER_ON_SOUND_DURATION = 1.7 + +NUM_PIXELS = 73 # Number of pixels used in project +NEOPIXEL_PIN = board.EXTERNAL_NEOPIXELS + +enable = digitalio.DigitalInOut(board.EXTERNAL_POWER) +enable.direction = digitalio.Direction.OUTPUT +enable.value = True + +strip = neopixel.NeoPixel(NEOPIXEL_PIN, NUM_PIXELS, brightness=1, auto_write=False) +strip.fill(0) # NeoPixels off ASAP on startup +strip.show() + +# i2s audio +audio = audiobusio.I2SOut(board.I2S_BIT_CLOCK, board.I2S_WORD_SELECT, board.I2S_DATA) +wave_file = None + +# Set up accelerometer on I2C bus, 4G range: +i2c = board.I2C() # uses board.SCL and board.SDA +# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller +accel = adafruit_lis3dh.LIS3DH_I2C(i2c) +accel.range = adafruit_lis3dh.RANGE_4_G + +COLOR_IDLE = COLOR # 'idle' color is the default +COLOR_HIT = ALT_COLOR # "hit" color is ALT_COLOR set above +COLOR_SWING = (255, 255, 255) # "swing" color white + + +def play_wav(name, loop=False): + """ + Play a WAV file in the 'sounds' directory. + :param name: partial file name string, complete name will be built around + this, e.g. passing 'foo' will play file 'sounds/foo.wav'. + :param loop: if True, sound will repeat indefinitely (until interrupted + by another sound). + """ + global wave_file # pylint: disable=global-statement + print("playing", name) + if wave_file: + wave_file.close() + try: + wave_file = open('sounds/' + name + '.wav', 'rb') + wave = audiocore.WaveFile(wave_file) + audio.play(wave, loop=loop) + except OSError: + pass # we'll just skip playing then + + +def power_on(sound, duration): + """ + Animate NeoPixels with accompanying sound effect for power on. + :param sound: sound name (similar format to play_wav() above) + :param duration: estimated duration of sound, in seconds (>0.0) + """ + prev = 0 + start_time = time.monotonic() # Save audio start time + play_wav(sound) + while True: + elapsed = time.monotonic() - start_time # Time spent playing sound + if elapsed > duration: # Past sound duration? + break # Stop animating + animation_time = elapsed / duration # Animation time, 0.0 to 1.0 + threshold = int(NUM_PIXELS * animation_time + 0.5) + num = threshold - prev # Number of pixels to light on this pass + if num != 0: + strip[prev:threshold] = [ALT_COLOR] * num + strip.show() + prev = threshold + + +def mix(color_1, color_2, weight_2): + """ + Blend between two colors with a given ratio. + :param color_1: first color, as an (r,g,b) tuple + :param color_2: second color, as an (r,g,b) tuple + :param weight_2: Blend weight (ratio) of second color, 0.0 to 1.0 + :return (r,g,b) tuple, blended color + """ + if weight_2 < 0.0: + weight_2 = 0.0 + elif weight_2 > 1.0: + weight_2 = 1.0 + weight_1 = 1.0 - weight_2 + return (int(color_1[0] * weight_1 + color_2[0] * weight_2), + int(color_1[1] * weight_1 + color_2[1] * weight_2), + int(color_1[2] * weight_1 + color_2[2] * weight_2)) + +# List of swing wav files without the .wav in the name for use with play_wav() +swing_sounds = [ + 'swing1', + 'swing2', + 'swing3', + 'swing4', +] + +# List of hit wav files without the .wav in the name for use with play_wav() +hit_sounds = [ + 'hit1', + 'hit2', + 'hit3', + 'hit4', +] + + +mode = 0 # Initial mode = OFF + +# Setup idle pulse +idle_brightness = IDLE_PULSE_BRIGHTNESS_MIN # current brightness of idle pulse +idle_increment = 0.01 # Initial idle pulse direction + +# Main loop +while True: + + if mode == 0: # If currently off... + enable.value = True + power_on('on', POWER_ON_SOUND_DURATION) # Power up! + play_wav('idle', loop=True) # Play idle sound now + mode = 1 # Idle mode + + # Setup for idle pulse + idle_brightness = IDLE_PULSE_BRIGHTNESS_MIN + idle_increment = 0.01 + strip.fill([int(c*idle_brightness) for c in COLOR]) + strip.show() + + elif mode >= 1: # If not OFF mode... + x, y, z = accel.acceleration # Read accelerometer + accel_total = x * x + z * z + # (Y axis isn't needed, due to the orientation that the Prop-Maker + # Wing is mounted. Also, square root isn't needed, since we're + # comparing thresholds...use squared values instead.) + if accel_total > HIT_THRESHOLD: # Large acceleration = HIT + TRIGGER_TIME = time.monotonic() # Save initial time of hit + play_wav(random.choice(hit_sounds)) # Start playing 'hit' sound + COLOR_ACTIVE = COLOR_HIT # Set color to fade from + mode = 3 # HIT mode + elif mode == 1 and accel_total > SWING_THRESHOLD: # Mild = SWING + TRIGGER_TIME = time.monotonic() # Save initial time of swing + play_wav(random.choice(swing_sounds)) # Randomly choose from available swing sounds + # make a larson scanner animation_time + strip_backup = strip[0:-1] + for p in range(-1, len(strip)): + for i in range (p-1, p+2): # shoot a 'ray' of 3 pixels + if 0 <= i < len(strip): + strip[i] = COLOR_SWING + strip.show() + time.sleep(SWING_BLAST_SPEED) + if 0 <= (p-1) < len(strip): + strip[p-1] = strip_backup[p-1] # restore previous color at the tail + strip.show() + while audio.playing: + pass # wait till we're done + mode = 2 # we'll go back to idle mode + + elif mode == 1: + # Idle pulse + idle_brightness += idle_increment # Pulse up + if idle_brightness > IDLE_PULSE_BRIGHTNESS_MAX or \ + idle_brightness < IDLE_PULSE_BRIGHTNESS_MIN: # Then... + idle_increment *= -1 # Pulse direction flip + strip.fill([int(c*idle_brightness) for c in COLOR_IDLE]) + strip.show() + time.sleep(IDLE_PULSE_SPEED) # Idle pulse speed set above + elif mode > 1: # If in SWING or HIT mode... + if audio.playing: # And sound currently playing... + blend = time.monotonic() - TRIGGER_TIME # Time since triggered + if mode == 2: # If SWING, + blend = abs(0.5 - blend) * 2.0 # ramp up, down + strip.fill(mix(COLOR_ACTIVE, COLOR, blend)) # Fade from hit/swing to base color + strip.show() + else: # No sound now, but still SWING or HIT modes + play_wav('idle', loop=True) # Resume idle sound + mode = 1 # Return to idle mode diff --git a/Halo_Energy_Sword/sounds/hit1.wav b/Halo_Energy_Sword/sounds/hit1.wav new file mode 100644 index 000000000..261a9698c Binary files /dev/null and b/Halo_Energy_Sword/sounds/hit1.wav differ diff --git a/Halo_Energy_Sword/sounds/hit2.wav b/Halo_Energy_Sword/sounds/hit2.wav new file mode 100644 index 000000000..08275dce5 Binary files /dev/null and b/Halo_Energy_Sword/sounds/hit2.wav differ diff --git a/Halo_Energy_Sword/sounds/hit3.wav b/Halo_Energy_Sword/sounds/hit3.wav new file mode 100644 index 000000000..78308d6cb Binary files /dev/null and b/Halo_Energy_Sword/sounds/hit3.wav differ diff --git a/Halo_Energy_Sword/sounds/hit4.wav b/Halo_Energy_Sword/sounds/hit4.wav new file mode 100644 index 000000000..a80edf5ae Binary files /dev/null and b/Halo_Energy_Sword/sounds/hit4.wav differ diff --git a/Halo_Energy_Sword/sounds/idle.wav b/Halo_Energy_Sword/sounds/idle.wav new file mode 100644 index 000000000..8f8194488 Binary files /dev/null and b/Halo_Energy_Sword/sounds/idle.wav differ diff --git a/Halo_Energy_Sword/sounds/on.wav b/Halo_Energy_Sword/sounds/on.wav new file mode 100644 index 000000000..42f581765 Binary files /dev/null and b/Halo_Energy_Sword/sounds/on.wav differ diff --git a/Halo_Energy_Sword/sounds/swing1.wav b/Halo_Energy_Sword/sounds/swing1.wav new file mode 100644 index 000000000..9aee36f9e Binary files /dev/null and b/Halo_Energy_Sword/sounds/swing1.wav differ diff --git a/Halo_Energy_Sword/sounds/swing2.wav b/Halo_Energy_Sword/sounds/swing2.wav new file mode 100644 index 000000000..2bf0e7244 Binary files /dev/null and b/Halo_Energy_Sword/sounds/swing2.wav differ diff --git a/Halo_Energy_Sword/sounds/swing3.wav b/Halo_Energy_Sword/sounds/swing3.wav new file mode 100644 index 000000000..a8f9bc81b Binary files /dev/null and b/Halo_Energy_Sword/sounds/swing3.wav differ diff --git a/Halo_Energy_Sword/sounds/swing4.wav b/Halo_Energy_Sword/sounds/swing4.wav new file mode 100644 index 000000000..d9fe2467b Binary files /dev/null and b/Halo_Energy_Sword/sounds/swing4.wav differ diff --git a/Haunt_Air_Blaster/code.py b/Haunt_Air_Blaster/code.py new file mode 100644 index 000000000..18ffe593c --- /dev/null +++ b/Haunt_Air_Blaster/code.py @@ -0,0 +1,70 @@ +# SPDX-FileCopyrightText: 2024 John Park for Adafruit Industries +# +# SPDX-License-Identifier: MIT +''' +Air Blaster +Feather RP2040 Prop-Maker with Power Relay FeatherWing and VL53L1X distance sensor +''' + +import time +import board +import digitalio +import adafruit_vl53l1x + +TRIGGER_DISTANCE = 50.0 +triggered = False + +i2c = board.STEMMA_I2C() +vl53 = adafruit_vl53l1x.VL53L1X(i2c) +vl53.distance_mode = 2 +vl53.timing_budget = 100 + +print("VL53L1X Simple Test.") +print("--------------------") +model_id, module_type, mask_rev = vl53.model_info +print("Model ID: 0x{:0X}".format(model_id)) +print("Module Type: 0x{:0X}".format(module_type)) +print("Mask Revision: 0x{:0X}".format(mask_rev)) +print("Distance Mode: ", end="") +if vl53.distance_mode == 1: + print("SHORT") +elif vl53.distance_mode == 2: + print("LONG") +else: + print("UNKNOWN") +print("Timing Budget: {}".format(vl53.timing_budget)) +print("--------------------") + +vl53.start_ranging() + +relay_pin = digitalio.DigitalInOut(board.D10) +relay_pin.direction = digitalio.Direction.OUTPUT +relay_pin.value = False + +def blast(repeat, duration, rate): + for _ in range(repeat): + relay_pin.value = True + print("bang") + time.sleep(duration) + relay_pin.value = False + time.sleep(rate) + +distance = None + +while True: + if vl53.data_ready: + distance = vl53.distance + print("Distance: {} cm".format(vl53.distance)) + vl53.clear_interrupt() + time.sleep(0.1) + + if distance: + if distance <= TRIGGER_DISTANCE: + if not triggered : + blast(3, 0.01, 0.1) # adjust repeat, duration, rate here + time.sleep(0.4) + blast(2, 0.01, 0.2) # adjust repeat, duration, rate here + triggered = True + + else: + triggered = False diff --git a/I2C_Multiple_Same_Address/arduino/multi_bme280_2x/.nrf52832.test.skip b/I2C_Multiple_Same_Address/arduino/multi_bme280_2x/.nrf52832.test.skip new file mode 100644 index 000000000..e69de29bb diff --git a/I2C_Multiple_Same_Address/arduino/multi_bme280_3x/.nrf52832.test.skip b/I2C_Multiple_Same_Address/arduino/multi_bme280_3x/.nrf52832.test.skip new file mode 100644 index 000000000..e69de29bb diff --git a/I2C_Multiple_Same_Address/arduino/multi_bme280_4x/.nrf52832.test.skip b/I2C_Multiple_Same_Address/arduino/multi_bme280_4x/.nrf52832.test.skip new file mode 100644 index 000000000..e69de29bb diff --git a/I2C_Multiple_Same_Address/arduino/multi_bme280_ltc4316/.uno.test.only b/I2C_Multiple_Same_Address/arduino/multi_bme280_ltc4316/.uno.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/I2C_Multiple_Same_Address/arduino/multi_bme280_ltc4316/multi_bme280_ltc4316.ino b/I2C_Multiple_Same_Address/arduino/multi_bme280_ltc4316/multi_bme280_ltc4316.ino new file mode 100644 index 000000000..4955bfb59 --- /dev/null +++ b/I2C_Multiple_Same_Address/arduino/multi_bme280_ltc4316/multi_bme280_ltc4316.ino @@ -0,0 +1,39 @@ +// SPDX-FileCopyrightText: 2024 Carter Nelson for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +// For each device, create a separate instance. +Adafruit_BME280 bme1; // BME280 #1 @ 0x77 +Adafruit_BME280 bme2; // BME280 #2 @ 0x37 + +void setup() { + Serial.begin(9600); + while(!Serial); + Serial.println(F("Two BME280 Example")); + + // NOTE: There's no need to manually call Wire.begin(). + // The BME280 library does that in its begin() method. + + // In the call to begin, pass in the I2C address. + // If left out, the default address is used. + // But also OK to just be explicit and specify. + bme1.begin(0x77); // address = 0x77 (default) + bme2.begin(0x37); // address = 0x37 (behind LTC4316) +} + + +void loop() { + float pressure1, pressure2; + + // Read each device separately + pressure1 = bme1.readPressure(); + pressure2 = bme2.readPressure(); + + Serial.println("------------------------------------"); + Serial.print("BME280 #1 Pressure = "); Serial.println(pressure1); + Serial.print("BME280 #2 Pressure = "); Serial.println(pressure2); + + delay(1000); +} diff --git a/I2C_Multiple_Same_Address/arduino/multi_tca_2x/.nrf52832.test.skip b/I2C_Multiple_Same_Address/arduino/multi_tca_2x/.nrf52832.test.skip new file mode 100644 index 000000000..e69de29bb diff --git a/I2C_Multiple_Same_Address/circuitpython/multi_bme280_ltc4316/code.py b/I2C_Multiple_Same_Address/circuitpython/multi_bme280_ltc4316/code.py new file mode 100755 index 000000000..7e5c32c88 --- /dev/null +++ b/I2C_Multiple_Same_Address/circuitpython/multi_bme280_ltc4316/code.py @@ -0,0 +1,34 @@ +# SPDX-FileCopyrightText: 2024 Carter Nelson for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +from adafruit_bme280 import basic as adafruit_bme280 + +# Get the board's default I2C port +i2c = board.I2C() # uses board.SCL and board.SDA +# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller + +#-------------------------------------------------------------------- +# NOTE!!! This is the "special" part of the code +# +# Create each sensor instance +# If left out, the default address is used. +# But also OK to be explicit and specify address. +bme1 = adafruit_bme280.Adafruit_BME280_I2C(i2c, 0x77) # address = 0x77 +bme2 = adafruit_bme280.Adafruit_BME280_I2C(i2c, 0x37) # address = 0x37 +#-------------------------------------------------------------------- + +print("Two BME280 Example") + +while True: + # Access each sensor via its instance + pressure1 = bme1.pressure + pressure2 = bme2.pressure + + print("-"*20) + print("BME280 #1 Pressure =", pressure1) + print("BME280 #2 Pressure =", pressure2) + + time.sleep(1) diff --git a/I2C_Scanners/arduino/i2c_scanner/.nrf52832.test.skip b/I2C_Scanners/arduino/i2c_scanner/.nrf52832.test.skip new file mode 100644 index 000000000..e69de29bb diff --git a/Introducing_Trinket_M0/Trinket_SDCardList/code.py b/Introducing_Trinket_M0/Trinket_SDCardList/code.py index 5131aca11..2c4020643 100644 --- a/Introducing_Trinket_M0/Trinket_SDCardList/code.py +++ b/Introducing_Trinket_M0/Trinket_SDCardList/code.py @@ -28,6 +28,8 @@ storage.mount(vfs, "/sd") def print_directory(path, tabs=0): for file in os.listdir(path): + if file == "?": + continue # Issue noted in Learn stats = os.stat(path + "/" + file) filesize = stats[6] isdir = stats[0] & 0x4000 diff --git a/IoT_Button_BFF_Examples/adafruitIO_iotButtonNeoPixelBFF/.none.test.only b/IoT_Button_BFF_Examples/adafruitIO_iotButtonNeoPixelBFF/.none.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/IoT_Christmas_Lights_Switch/code.py b/IoT_Christmas_Lights_Switch/code.py new file mode 100644 index 000000000..94062441d --- /dev/null +++ b/IoT_Christmas_Lights_Switch/code.py @@ -0,0 +1,55 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import os +import ssl +import wifi +import socketpool +import microcontroller +import board +import digitalio +import adafruit_requests +from adafruit_io.adafruit_io import IO_HTTP, AdafruitIO_RequestError + +aio_username = os.getenv("ADAFRUIT_AIO_USERNAME") +aio_key = os.getenv("ADAFRUIT_AIO_KEY") + +# buttons +button = digitalio.DigitalInOut(board.D5) +button.direction = digitalio.Direction.INPUT +button.pull = digitalio.Pull.UP +button_state = False + +lights_on = False + +print() +print("Connecting to WiFi...") +# connect to your SSID +wifi.radio.connect(os.getenv('CIRCUITPY_WIFI_SSID'), os.getenv('CIRCUITPY_WIFI_PASSWORD')) +print("Connected to WiFi!") + +pool = socketpool.SocketPool(wifi.radio) +requests = adafruit_requests.Session(pool, ssl.create_default_context()) + +io = IO_HTTP(aio_username, aio_key, requests) + +try: + feed_lights = io.get_feed("lights") +except AdafruitIO_RequestError: + feed_lights = io.create_new_feed("lights") + +while True: + try: + if not button.value and button_state: + button_state = False + if button.value and not button_state: + print("pressed") + lights_on = not lights_on + io.send_data(feed_lights["key"], int(lights_on)) + button_state = True + except Exception as error: # pylint: disable=broad-except + print(error) + time.sleep(5) + microcontroller.reset() diff --git a/IrRobotControl/glove/code.py b/IrRobotControl/glove/code.py index 3eafa211f..accacb0b8 100644 --- a/IrRobotControl/glove/code.py +++ b/IrRobotControl/glove/code.py @@ -33,9 +33,9 @@ sensor = adafruit_lis3dh.LIS3DH_I2C(i2c, address=0x19) pulseout = pulseio.PulseOut(board.IR_TX, frequency=38000, duty_cycle=2 ** 15) # Create an encoder that will take numbers and turn them into IR pulses -encoder = adafruit_irremote.GenericTransmit(header=[9500, 4500], - one=[550, 550], - zero=[550, 1700], +encoder = adafruit_irremote.GenericTransmit(header=[9000, 4500], + one=[560, 1700], + zero=[560, 560], trail=0) def log(s): diff --git a/Keypad_Examples/macropad_simple/code.py b/Keypad_Examples/macropad_simple/code.py new file mode 100644 index 000000000..0cbcda5c2 --- /dev/null +++ b/Keypad_Examples/macropad_simple/code.py @@ -0,0 +1,41 @@ +# SPDX-FileCopyrightText: 2022 Dan Halbert for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import board +import keypad +import neopixel + +KEY_PINS = ( + board.KEY1, + board.KEY2, + board.KEY3, + board.KEY4, + board.KEY5, + board.KEY6, + board.KEY7, + board.KEY8, + board.KEY9, + board.KEY10, + board.KEY11, + board.KEY12, +) + +keys = keypad.Keys(KEY_PINS, value_when_pressed=False, pull=True) + +neopixels = neopixel.NeoPixel(board.NEOPIXEL, 12, brightness=0.4) + +while True: + event = keys.events.get() + if event: + # A key transition occurred. + print(event) + + if event.pressed: + # Turn the key blue when pressed + neopixels[event.key_number] = (0, 0, 255) + + # This could just be `else:`, + # since event.pressed and event.released are opposites. + if event.released: + neopixels[event.key_number] = (0, 0, 0) diff --git a/LED_Bullwhip/code.py b/LED_Bullwhip/code.py index 905e510bc..5bbcdde51 100644 --- a/LED_Bullwhip/code.py +++ b/LED_Bullwhip/code.py @@ -20,7 +20,16 @@ import digitalio import audiobusio import board import neopixel -import adafruit_lsm6ds + +i2c = board.I2C() # uses board.SCL and board.SDA + +# check for LSM6DS33 or LSM6DS3TR-C +try: + from adafruit_lsm6ds.lsm6ds33 import LSM6DS33 as LSM6DS + sensor = LSM6DS(i2c) +except RuntimeError: + from adafruit_lsm6ds.lsm6ds3 import LSM6DS3 as LSM6DS + sensor = LSM6DS(i2c) # CUSTOMISE COLORS HERE: COLOR = (40, 3, 0) # Default idle is blood orange @@ -70,12 +79,7 @@ strip.show() WAVE_FILE = None -i2c = board.I2C() # uses board.SCL and board.SDA -# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller - -#Set up accelerometer & mic - -sensor = adafruit_lsm6ds.LSM6DS33(i2c) +#Set up mic mic = audiobusio.PDMIn(board.MICROPHONE_CLOCK, board.MICROPHONE_DATA, sample_rate=16000, diff --git a/LEGO_Carousel_PropMaker/carousel-loop.wav b/LEGO_Carousel_PropMaker/carousel-loop.wav new file mode 100644 index 000000000..519b2f7e7 Binary files /dev/null and b/LEGO_Carousel_PropMaker/carousel-loop.wav differ diff --git a/LEGO_Carousel_PropMaker/code.py b/LEGO_Carousel_PropMaker/code.py new file mode 100644 index 000000000..4d4de0672 --- /dev/null +++ b/LEGO_Carousel_PropMaker/code.py @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: 2024 Noe Ruiz for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import board +import audiocore +import audiobusio +import audiomixer +from digitalio import DigitalInOut, Direction +import pwmio +import neopixel +from adafruit_led_animation.animation.rainbow import Rainbow +from adafruit_motor import servo + +# enable external power pin +# provides power to the external components +external_power = DigitalInOut(board.EXTERNAL_POWER) +external_power.direction = Direction.OUTPUT +external_power.value = True + +# i2s playback +wave_file = open("carousel-loop.wav", "rb") +wave = audiocore.WaveFile(wave_file) +audio = audiobusio.I2SOut(board.I2S_BIT_CLOCK, board.I2S_WORD_SELECT, board.I2S_DATA) +mixer = audiomixer.Mixer(voice_count=1, sample_rate=22050, channel_count=1, + bits_per_sample=16, samples_signed=True) +audio.play(mixer) +mixer.voice[0].play(wave, loop=True) + +# servo control +pwm = pwmio.PWMOut(board.EXTERNAL_SERVO, frequency=5) +prop_servo = servo.ContinuousServo(pwm) + +# external neopixels +num_pixels = 43 +pixels = neopixel.NeoPixel(board.EXTERNAL_NEOPIXELS, num_pixels) +pixels.brightness = 0.3 +rainbow = Rainbow(pixels, speed=0.05, period=2) + +while True: + prop_servo.throttle = 1 + rainbow.animate() + mixer.voice[0].level = 1 diff --git a/LTC4316_Examples/LTC4316_Arduino_Example/.uno.test.only b/LTC4316_Examples/LTC4316_Arduino_Example/.uno.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/LTC4316_Examples/LTC4316_Arduino_Example/LTC4316_Arduino_Example.ino b/LTC4316_Examples/LTC4316_Arduino_Example/LTC4316_Arduino_Example.ino new file mode 100644 index 000000000..71c7fbf29 --- /dev/null +++ b/LTC4316_Examples/LTC4316_Arduino_Example/LTC4316_Arduino_Example.ino @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2023 Carter Nelson for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// LTC4315 with two AHT20 sensors example +// Set the LTC4315 switch A5 on and switch A4 off +// The translated sensor will be on address 0x68 + +#include + +Adafruit_AHTX0 default_aht; +Adafruit_AHTX0 ltc4316_aht; + +void setup() { + Serial.begin(115200); + while ( !Serial ) delay(10); + Serial.println("Adafruit AHT20 with LTC4316 demo!"); + if (! default_aht.begin(&Wire, 0, 0x38)) { + Serial.println("Could not find AHT20 on 0x38? Check wiring."); + while (1) delay(10); + } + if (! ltc4316_aht.begin(&Wire, 0, 0x68)) { + Serial.println("Could not find AHT20 attached to LTC4316 on 0x68? Check wiring and switches"); + while (1) delay(10); + } + Serial.println("AHT20 sensors found on 0x38 and 0x68"); +} + +void loop() { + sensors_event_t humidity0, temp0; + sensors_event_t humidity1, temp1; + default_aht.getEvent(&humidity0, &temp0);// populate temp and humidity objects with fresh data + ltc4316_aht.getEvent(&humidity1, &temp1);// populate temp and humidity objects with fresh data + Serial.println("AHT20 on 0x38:"); + Serial.print("Temperature: "); Serial.print(temp0.temperature); Serial.println(" degrees C"); + Serial.print("Humidity: "); Serial.print(humidity0.relative_humidity); Serial.println("% rH"); + Serial.println(); + Serial.println("AHT20 on 0x68:"); + Serial.print("Temperature: "); Serial.print(temp1.temperature); Serial.println(" degrees C"); + Serial.print("Humidity: "); Serial.print(humidity1.relative_humidity); Serial.println("% rH"); + Serial.println(); + + delay(500); +} diff --git a/LTC4316_Examples/LTC4316_CircuitPython_Example/code.py b/LTC4316_Examples/LTC4316_CircuitPython_Example/code.py new file mode 100644 index 000000000..2d8fde796 --- /dev/null +++ b/LTC4316_Examples/LTC4316_CircuitPython_Example/code.py @@ -0,0 +1,27 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# SPDX-License-Identifier: MIT + +""" +LTC4315 with two AHT20 sensors example +Set the LTC4315 switch A5 on and switch A4 off +The translated sensor will be on address 0x68 +""" + +import time +import board +import adafruit_ahtx0 + +# Create sensor object, communicating over the board's default I2C bus +i2c = board.I2C() # uses board.SCL and board.SDA +# i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller +default_sensor = adafruit_ahtx0.AHTx0(i2c, 0x38) +translated_sensor = adafruit_ahtx0.AHTx0(i2c, 0x68) + +while True: + print("\nAHT20 at 0x38:") + print(f"Temperature: {default_sensor.temperature:0.1f} C") + print(f"Humidity: {default_sensor.relative_humidity:0.1f} %") + print("\nAHT20 at 0x68:") + print(f"Temperature: {translated_sensor.temperature:0.1f} C") + print(f"Humidity: {translated_sensor.relative_humidity:0.1f} %") + time.sleep(2) diff --git a/MEMENTO/IoT_Bird_Feeder/code.py b/MEMENTO/IoT_Bird_Feeder/code.py index 79bd448bc..a6d370e72 100644 --- a/MEMENTO/IoT_Bird_Feeder/code.py +++ b/MEMENTO/IoT_Bird_Feeder/code.py @@ -59,7 +59,7 @@ pir.direction = digitalio.Direction.INPUT def send_jpeg_to_io(): # before we send the image to IO, it needs to be encoded into base64 - encoded_data = binascii.b2a_base64(jpeg).strip() + encoded_data = binascii.b2a_base64(jpeg).strip().decode("utf-8") # then, send the encoded_data to Adafruit IO camera feed print("Sending image to IO...") io.send_data(feed_camera["key"], encoded_data) diff --git a/MEMENTO/MEMENTO_OpenAI_Image_Descriptor/code.py b/MEMENTO/MEMENTO_OpenAI_Image_Descriptor/code.py index 6a7a0b2b6..a72021082 100644 --- a/MEMENTO/MEMENTO_OpenAI_Image_Descriptor/code.py +++ b/MEMENTO/MEMENTO_OpenAI_Image_Descriptor/code.py @@ -65,7 +65,7 @@ def send_img(img, prompt): "Authorization": f"Bearer {openai_api_key}" } payload = { - "model": "gpt-4-vision-preview", + "model": "gpt-4-turbo", "messages": [ { "role": "user", diff --git a/MEMENTO/Memento_Face_Detect_Recognize/memento_platformio_camera/lib/Adafruit_PyCamera/.github/ISSUE_TEMPLATE.md b/MEMENTO/Memento_Face_Detect_Recognize/memento_platformio_camera/lib/Adafruit_PyCamera/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index f0e26146f..000000000 --- a/MEMENTO/Memento_Face_Detect_Recognize/memento_platformio_camera/lib/Adafruit_PyCamera/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,46 +0,0 @@ -Thank you for opening an issue on an Adafruit Arduino library repository. To -improve the speed of resolution please review the following guidelines and -common troubleshooting steps below before creating the issue: - -- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use - the forums at http://forums.adafruit.com to ask questions and troubleshoot why - something isn't working as expected. In many cases the problem is a common issue - that you will more quickly receive help from the forum community. GitHub issues - are meant for known defects in the code. If you don't know if there is a defect - in the code then start with troubleshooting on the forum first. - -- **If following a tutorial or guide be sure you didn't miss a step.** Carefully - check all of the steps and commands to run have been followed. Consult the - forum if you're unsure or have questions about steps in a guide/tutorial. - -- **For Arduino projects check these very common issues to ensure they don't apply**: - - - For uploading sketches or communicating with the board make sure you're using - a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes - very hard to tell the difference between a data and charge cable! Try using the - cable with other devices or swapping to another cable to confirm it is not - the problem. - - - **Be sure you are supplying adequate power to the board.** Check the specs of - your board and plug in an external power supply. In many cases just - plugging a board into your computer is not enough to power it and other - peripherals. - - - **Double check all soldering joints and connections.** Flakey connections - cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints. - - - **Ensure you are using an official Arduino or Adafruit board.** We can't - guarantee a clone board will have the same functionality and work as expected - with this code and don't support them. - -If you're sure this issue is a defect in the code and checked the steps above -please fill in the following fields to provide enough troubleshooting information. -You may delete the guideline and text above to just leave the following details: - -- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE** - -- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO - VERSION HERE** - -- List the steps to reproduce the problem below (if possible attach a sketch or - copy the sketch code in too): **LIST REPRO STEPS BELOW** diff --git a/MEMENTO/Memento_Face_Detect_Recognize/memento_platformio_camera/lib/Adafruit_PyCamera/.github/PULL_REQUEST_TEMPLATE.md b/MEMENTO/Memento_Face_Detect_Recognize/memento_platformio_camera/lib/Adafruit_PyCamera/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 7b641eb86..000000000 --- a/MEMENTO/Memento_Face_Detect_Recognize/memento_platformio_camera/lib/Adafruit_PyCamera/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,26 +0,0 @@ -Thank you for creating a pull request to contribute to Adafruit's GitHub code! -Before you open the request please review the following guidelines and tips to -help it be more easily integrated: - -- **Describe the scope of your change--i.e. what the change does and what parts - of the code were modified.** This will help us understand any risks of integrating - the code. - -- **Describe any known limitations with your change.** For example if the change - doesn't apply to a supported platform of the library please mention it. - -- **Please run any tests or examples that can exercise your modified code.** We - strive to not break users of the code and running tests/examples helps with this - process. - -Thank you again for contributing! We will try to test and integrate the change -as soon as we can, but be aware we have many GitHub repositories to manage and -can't immediately respond to every request. There is no need to bump or check in -on a pull request (it will clutter the discussion of the request). - -Also don't be worried if the request is closed or not integrated--sometimes the -priorities of Adafruit's GitHub code (education, ease of use) might not match the -priorities of the pull request. Don't fret, the open source community thrives on -forks and GitHub makes it easy to keep your changes in a forked repo. - -After reviewing the guidelines above you can delete this text from the pull request. diff --git a/MEMENTO/Memento_Face_Detect_Recognize/memento_platformio_camera/lib/Adafruit_PyCamera/.github/workflows/githubci.yml b/MEMENTO/Memento_Face_Detect_Recognize/memento_platformio_camera/lib/Adafruit_PyCamera/.github/workflows/githubci.yml deleted file mode 100644 index fcd3f724c..000000000 --- a/MEMENTO/Memento_Face_Detect_Recognize/memento_platformio_camera/lib/Adafruit_PyCamera/.github/workflows/githubci.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Arduino Library CI - -on: [pull_request, push, repository_dispatch] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/setup-python@v4 - with: - python-version: '3.x' - - uses: actions/checkout@v3 - - uses: actions/checkout@v3 - with: - repository: adafruit/ci-arduino - path: ci - - - name: pre-install - run: bash ci/actions_install.sh - - - name: test platforms - run: python3 ci/build_platform.py "pycamera_s3" - - - name: list - run: | - ls - ls examples/*/build/ - - - name: Upload build artifacts - uses: actions/upload-artifact@v3 - with: - name: example_uf2s - path: | - examples/*/build/*/*.uf2 - - - name: clang - run: python3 ci/run-clang-format.py -e "ci/*" -e "bin/*" -r . - - - name: doxygen - env: - GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }} - PRETTYNAME : "Adafruit PyCamera Library" - run: bash ci/doxy_gen_and_deploy.sh diff --git a/MEMENTO/Memento_IOT_Doorbell/code.py b/MEMENTO/Memento_IOT_Doorbell/code.py index ccd792742..aa2bb1df9 100755 --- a/MEMENTO/Memento_IOT_Doorbell/code.py +++ b/MEMENTO/Memento_IOT_Doorbell/code.py @@ -83,19 +83,24 @@ def capture_send_image(): print("Sent image to IO!") else: print("ERROR: JPEG frame capture failed!") - print("DONE, waiting for next press..") - # Turn the LED on to signal that the doorbell is ready to be pressed again - led.value = True while True: # Wait until the doorbell is pressed if not pin_button.value: print("Doorbell pressed!") + # Turn the doorbell LED off to signal that it has been pressed led.value = False + # Play a doorbell tone using the speaker pycam.tone(95, 0.5) pycam.tone(70, 0.5) + capture_send_image() + + print("DONE, waiting for next press..") + + # Turn the LED on to signal that the doorbell is ready to be pressed again + led.value = True time.sleep(0.01) diff --git a/MEMENTO/Memento_Shoulder_Robot/platformio_memento_shoulder_camera/lib/Adafruit_PyCamera/.github/ISSUE_TEMPLATE.md b/MEMENTO/Memento_Shoulder_Robot/platformio_memento_shoulder_camera/lib/Adafruit_PyCamera/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index f0e26146f..000000000 --- a/MEMENTO/Memento_Shoulder_Robot/platformio_memento_shoulder_camera/lib/Adafruit_PyCamera/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,46 +0,0 @@ -Thank you for opening an issue on an Adafruit Arduino library repository. To -improve the speed of resolution please review the following guidelines and -common troubleshooting steps below before creating the issue: - -- **Do not use GitHub issues for troubleshooting projects and issues.** Instead use - the forums at http://forums.adafruit.com to ask questions and troubleshoot why - something isn't working as expected. In many cases the problem is a common issue - that you will more quickly receive help from the forum community. GitHub issues - are meant for known defects in the code. If you don't know if there is a defect - in the code then start with troubleshooting on the forum first. - -- **If following a tutorial or guide be sure you didn't miss a step.** Carefully - check all of the steps and commands to run have been followed. Consult the - forum if you're unsure or have questions about steps in a guide/tutorial. - -- **For Arduino projects check these very common issues to ensure they don't apply**: - - - For uploading sketches or communicating with the board make sure you're using - a **USB data cable** and **not** a **USB charge-only cable**. It is sometimes - very hard to tell the difference between a data and charge cable! Try using the - cable with other devices or swapping to another cable to confirm it is not - the problem. - - - **Be sure you are supplying adequate power to the board.** Check the specs of - your board and plug in an external power supply. In many cases just - plugging a board into your computer is not enough to power it and other - peripherals. - - - **Double check all soldering joints and connections.** Flakey connections - cause many mysterious problems. See the [guide to excellent soldering](https://learn.adafruit.com/adafruit-guide-excellent-soldering/tools) for examples of good solder joints. - - - **Ensure you are using an official Arduino or Adafruit board.** We can't - guarantee a clone board will have the same functionality and work as expected - with this code and don't support them. - -If you're sure this issue is a defect in the code and checked the steps above -please fill in the following fields to provide enough troubleshooting information. -You may delete the guideline and text above to just leave the following details: - -- Arduino board: **INSERT ARDUINO BOARD NAME/TYPE HERE** - -- Arduino IDE version (found in Arduino -> About Arduino menu): **INSERT ARDUINO - VERSION HERE** - -- List the steps to reproduce the problem below (if possible attach a sketch or - copy the sketch code in too): **LIST REPRO STEPS BELOW** diff --git a/MEMENTO/Memento_Shoulder_Robot/platformio_memento_shoulder_camera/lib/Adafruit_PyCamera/.github/PULL_REQUEST_TEMPLATE.md b/MEMENTO/Memento_Shoulder_Robot/platformio_memento_shoulder_camera/lib/Adafruit_PyCamera/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 7b641eb86..000000000 --- a/MEMENTO/Memento_Shoulder_Robot/platformio_memento_shoulder_camera/lib/Adafruit_PyCamera/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,26 +0,0 @@ -Thank you for creating a pull request to contribute to Adafruit's GitHub code! -Before you open the request please review the following guidelines and tips to -help it be more easily integrated: - -- **Describe the scope of your change--i.e. what the change does and what parts - of the code were modified.** This will help us understand any risks of integrating - the code. - -- **Describe any known limitations with your change.** For example if the change - doesn't apply to a supported platform of the library please mention it. - -- **Please run any tests or examples that can exercise your modified code.** We - strive to not break users of the code and running tests/examples helps with this - process. - -Thank you again for contributing! We will try to test and integrate the change -as soon as we can, but be aware we have many GitHub repositories to manage and -can't immediately respond to every request. There is no need to bump or check in -on a pull request (it will clutter the discussion of the request). - -Also don't be worried if the request is closed or not integrated--sometimes the -priorities of Adafruit's GitHub code (education, ease of use) might not match the -priorities of the pull request. Don't fret, the open source community thrives on -forks and GitHub makes it easy to keep your changes in a forked repo. - -After reviewing the guidelines above you can delete this text from the pull request. diff --git a/MEMENTO/Memento_Shoulder_Robot/platformio_memento_shoulder_camera/lib/Adafruit_PyCamera/.github/workflows/githubci.yml b/MEMENTO/Memento_Shoulder_Robot/platformio_memento_shoulder_camera/lib/Adafruit_PyCamera/.github/workflows/githubci.yml deleted file mode 100644 index fcd3f724c..000000000 --- a/MEMENTO/Memento_Shoulder_Robot/platformio_memento_shoulder_camera/lib/Adafruit_PyCamera/.github/workflows/githubci.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Arduino Library CI - -on: [pull_request, push, repository_dispatch] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/setup-python@v4 - with: - python-version: '3.x' - - uses: actions/checkout@v3 - - uses: actions/checkout@v3 - with: - repository: adafruit/ci-arduino - path: ci - - - name: pre-install - run: bash ci/actions_install.sh - - - name: test platforms - run: python3 ci/build_platform.py "pycamera_s3" - - - name: list - run: | - ls - ls examples/*/build/ - - - name: Upload build artifacts - uses: actions/upload-artifact@v3 - with: - name: example_uf2s - path: | - examples/*/build/*/*.uf2 - - - name: clang - run: python3 ci/run-clang-format.py -e "ci/*" -e "bin/*" -r . - - - name: doxygen - env: - GH_REPO_TOKEN: ${{ secrets.GH_REPO_TOKEN }} - PRETTYNAME : "Adafruit PyCamera Library" - run: bash ci/doxy_gen_and_deploy.sh diff --git a/MEMENTO/Memento_itsaSNAP_Capture_Cam/code.py b/MEMENTO/Memento_itsaSNAP_Capture_Cam/code.py new file mode 100755 index 000000000..c2d03ee38 --- /dev/null +++ b/MEMENTO/Memento_itsaSNAP_Capture_Cam/code.py @@ -0,0 +1,148 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Trevor Beaton for Adafruit Industries +# SPDX-License-Identifier: MIT + +import os +import time +import ssl +import binascii +import gc +import wifi +import socketpool +import adafruit_requests +import adafruit_minimqtt.adafruit_minimqtt as MQTT +from adafruit_io.adafruit_io import IO_HTTP, AdafruitIO_RequestError +import adafruit_pycamera + +# WiFi and Adafruit IO setup +aio_username = os.getenv("AIO_USERNAME") +aio_key = os.getenv("AIO_KEY") + +print(f"Connecting to {os.getenv('CIRCUITPY_WIFI_SSID')}") +wifi.radio.connect( + os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD") +) +print(f"Connected to {os.getenv('CIRCUITPY_WIFI_SSID')}!") + +mqtt_broker = "io.adafruit.com" +mqtt_port = 1883 +mqtt_topic = aio_username + "/feeds/cameratrigger" + +pool = socketpool.SocketPool(wifi.radio) +requests = adafruit_requests.Session(pool, ssl.create_default_context()) + +# Initialize an Adafruit IO HTTP API object +io = IO_HTTP(aio_username, aio_key, requests) + +# Adafruit IO feed configuration +try: + feed_camera = io.get_feed("camera") +except AdafruitIO_RequestError: + feed_camera = io.create_new_feed("camera") + +# Initialize memento camera +pycam = adafruit_pycamera.PyCamera() +time.sleep(2) # + +# Camera settings +pycam.mode = 0 +pycam.resolution = 3 +pycam.led_level = 1 +pycam.led_color = 0 +pycam.effect = 0 + +def cameraChime(): + notes = [ + (1046, 0.1), # C6 + (1318, 0.1), # E6 + (1568, 0.4), # G6 + ] + for frequency, duration in notes: + pycam.tone(frequency, duration) + time.sleep(0.05) + +cameraChime() + +def on_mqtt_connect(client, _, __, ___): + print(f"Connected to MQTT broker! Listening for topic changes on {mqtt_topic}") + client.subscribe(mqtt_topic) + +def on_mqtt_disconnect(_, __, ___): + print("Disconnected from MQTT broker!") + +def on_mqtt_message(_, topic, message): + print(f"New message on topic {topic}: {message}") + cameraChime() + capture_send_image() + +# Set up MQTT client +ssl_context = ssl.create_default_context() +mqtt_client = MQTT.MQTT( + broker=mqtt_broker, + port=mqtt_port, + username=aio_username, + password=aio_key, + socket_pool=pool, + ssl_context=ssl_context, + socket_timeout=5, + keep_alive=60 +) +# Set up callbacks +mqtt_client.on_connect = on_mqtt_connect +mqtt_client.on_disconnect = on_mqtt_disconnect +mqtt_client.on_message = on_mqtt_message + + +# Connect to MQTT broker +print("Connecting to MQTT broker...") +mqtt_client.connect() + +def capture_send_image(): + """Captures an image and sends it to Adafruit IO.""" + gc.collect() # Free up memory before capture + try: + pycam.autofocus() + time.sleep(1) # Add a small delay after autofocus + jpeg = pycam.capture_into_jpeg() + print("Captured image!") + if jpeg is not None: + print("Encoding image...") + encoded_data = binascii.b2a_base64(jpeg).strip() + print("Sending image to Adafruit IO...") + io.send_data(feed_camera["key"], encoded_data) + print("Sent image to IO!") + cameraChime() + else: + print("ERROR: JPEG frame capture failed!") + except (OSError, RuntimeError) as capture_error: + print(f"Error during capture: {capture_error}") + +last_mqtt_check = 0 +MQTT_CHECK_INTERVAL = 1 # Check MQTT every 1 second + +while True: + try: + current_time = time.monotonic() + + # Check MQTT messages periodically + if current_time - last_mqtt_check >= MQTT_CHECK_INTERVAL: + mqtt_client.loop(timeout=6) + last_mqtt_check = current_time + + pycam.keys_debounce() + if pycam.shutter.short_count: + print("Manual capture triggered") + capture_send_image() + + time.sleep(0.1) + except MQTT.MMQTTException as mqtt_error: + print(f"MQTT Error: {mqtt_error}") + time.sleep(5) + print("Attempting to reconnect...") + try: + mqtt_client.reconnect() + print("Reconnected successfully!") + except (OSError, RuntimeError) as reconnect_error: + print(f"Failed to reconnect: {reconnect_error}") + except (OSError, RuntimeError) as loop_error: + print(f"Error in main loop: {loop_error}") + time.sleep(5) diff --git a/Macropad_2FA_TOTP/code.py b/Macropad_2FA_TOTP/code.py index 9a9b7c378..4e7546371 100755 --- a/Macropad_2FA_TOTP/code.py +++ b/Macropad_2FA_TOTP/code.py @@ -10,7 +10,7 @@ import keypad import rotaryio import neopixel # crypto stuff -import adafruit_pcf8523 +from adafruit_pcf8523.pcf8523 import PCF8523 import adafruit_hashlib as hashlib # UI stuff import displayio @@ -45,7 +45,7 @@ except KeyError: # set board to use PCF8523 as its RTC i2c = board.I2C() # uses board.SCL and board.SDA # i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller -pcf = adafruit_pcf8523.PCF8523(i2c) +pcf = PCF8523(i2c) rtc.set_time_source(pcf) #------------------------------------------------------------------------- diff --git a/Macropad_2FA_TOTP/rtc_setter.py b/Macropad_2FA_TOTP/rtc_setter.py index 8a6f9572e..7a5ed62d6 100755 --- a/Macropad_2FA_TOTP/rtc_setter.py +++ b/Macropad_2FA_TOTP/rtc_setter.py @@ -4,11 +4,11 @@ import time import board -import adafruit_pcf8523 +from adafruit_pcf8523.pcf8523 import PCF8523 i2c = board.I2C() # uses board.SCL and board.SDA # i2c = board.STEMMA_I2C() # For using the built-in STEMMA QT connector on a microcontroller -pcf = adafruit_pcf8523.PCF8523(i2c) +pcf = PCF8523(i2c) # values to set YEAR = 2021 diff --git a/Macropad_Hotkeys/code.py b/Macropad_Hotkeys/code.py index 56335e8f1..986f1f1db 100755 --- a/Macropad_Hotkeys/code.py +++ b/Macropad_Hotkeys/code.py @@ -39,6 +39,10 @@ class App: """ Activate application settings; update OLED labels and LED colors. """ group[13].text = self.name # Application name + if self.name: + rect.fill = 0xFFFFFF + else: # empty app name indicates blank screen for which we dimm header + rect.fill = 0x000000 for i in range(12): if i < len(self.macros): # Key in use, set label + LED color macropad.pixels[i] = self.macros[i][0] @@ -70,9 +74,10 @@ for key_index in range(12): macropad.display.height - 1 - (3 - y) * 12), anchor_point=(x / 2, 1.0))) -group.append(Rect(0, 0, macropad.display.width, 12, fill=0xFFFFFF)) +rect = Rect(0, 0, macropad.display.width, 13, fill=0xFFFFFF) +group.append(rect) group.append(label.Label(terminalio.FONT, text='', color=0x000000, - anchored_position=(macropad.display.width//2, -2), + anchored_position=(macropad.display.width//2, 0), anchor_point=(0.5, 0.0))) macropad.display.root_group = group diff --git a/Macropad_Hotkeys/macros/zzz_blank.py b/Macropad_Hotkeys/macros/zzz_blank.py new file mode 100755 index 000000000..4b7dd620b --- /dev/null +++ b/Macropad_Hotkeys/macros/zzz_blank.py @@ -0,0 +1,31 @@ +# SPDX-FileCopyrightText: 2021 Victor Toni - GitHub @vitoni +# +# SPDX-License-Identifier: MIT + +# MACROPAD Hotkeys example: blank screen for idle + + +app = { # REQUIRED dict, must be named 'app' + 'name' : '', # Application name + 'macros' : [ # List of button macros... + # COLOR LABEL KEY SEQUENCE + # 1st row ---------- + (0x000000, '', []), + (0x000000, '', []), + (0x000000, '', []), + # 2nd row ---------- + (0x000000, '', []), + (0x000000, '', []), + (0x000000, '', []), + # 3rd row ---------- + (0x000000, '', []), + (0x000000, '', []), + (0x000000, '', []), + # 4th row ---------- + (0x000000, '', []), + (0x000000, '', []), + (0x000000, '', []), + # Encoder button --- + (0x000000, '', []) + ] +} diff --git a/MagTag/MagTag_Arduino_Demos/quotes/quotes.ino b/MagTag/MagTag_Arduino_Demos/quotes/quotes.ino index 22ed8eb8b..b433e8436 100644 --- a/MagTag/MagTag_Arduino_Demos/quotes/quotes.ino +++ b/MagTag/MagTag_Arduino_Demos/quotes/quotes.ino @@ -9,6 +9,7 @@ */ #include +#include #include #include "Adafruit_ThinkInk.h" #include "Adafruit_NeoPixel.h" diff --git a/MagTag/MagTag_Google_Calendar/authenticator.py b/MagTag/MagTag_Google_Calendar/authenticator.py index 5d2f8ebef..b008b2da2 100755 --- a/MagTag/MagTag_Google_Calendar/authenticator.py +++ b/MagTag/MagTag_Google_Calendar/authenticator.py @@ -81,7 +81,7 @@ label_verification_url.text = ( label_user_code.text = "2. Enter code: %s" % google_auth.user_code graphics.qrcode(google_auth.verification_url.encode(), qr_size=2, x=240, y=70) -graphics.display.show(graphics.splash) +graphics.display.root_group = graphics.splash display.refresh() # Poll Google's authorization server diff --git a/MagTag/MagTag_Weather/openmeteo/bmps/weather_bg.bmp b/MagTag/MagTag_Weather/openmeteo/bmps/weather_bg.bmp new file mode 100755 index 000000000..d3f3e53fc Binary files /dev/null and b/MagTag/MagTag_Weather/openmeteo/bmps/weather_bg.bmp differ diff --git a/MagTag/MagTag_Weather/openmeteo/bmps/weather_icons_20px.bmp b/MagTag/MagTag_Weather/openmeteo/bmps/weather_icons_20px.bmp new file mode 100755 index 000000000..aa7faae9c Binary files /dev/null and b/MagTag/MagTag_Weather/openmeteo/bmps/weather_icons_20px.bmp differ diff --git a/MagTag/MagTag_Weather/openmeteo/bmps/weather_icons_70px.bmp b/MagTag/MagTag_Weather/openmeteo/bmps/weather_icons_70px.bmp new file mode 100755 index 000000000..9c78c1403 Binary files /dev/null and b/MagTag/MagTag_Weather/openmeteo/bmps/weather_icons_70px.bmp differ diff --git a/MagTag/MagTag_Weather/openmeteo/code.py b/MagTag/MagTag_Weather/openmeteo/code.py new file mode 100644 index 000000000..932f90124 --- /dev/null +++ b/MagTag/MagTag_Weather/openmeteo/code.py @@ -0,0 +1,308 @@ +# SPDX-FileCopyrightText: 2024 Carter Nelson for Adafruit Industries +# +# SPDX-License-Identifier: MIT +# pylint: disable=redefined-outer-name, eval-used, wrong-import-order, unsubscriptable-object + +import time +import terminalio +import displayio +import adafruit_imageload +from adafruit_display_text import label +from adafruit_magtag.magtag import MagTag + +# --| USER CONFIG |-------------------------- +LAT = 47.6 # latitude +LON = -122.3 # longitude +TMZ = "America/Los_Angeles" # https://en.wikipedia.org/wiki/List_of_tz_database_time_zones +METRIC = False # set to True for metric units +CITY = None # optional +# ------------------------------------------- + +# ---------------------------- +# Define various assets +# ---------------------------- +BACKGROUND_BMP = "/bmps/weather_bg.bmp" +ICONS_LARGE_FILE = "/bmps/weather_icons_70px.bmp" +ICONS_SMALL_FILE = "/bmps/weather_icons_20px.bmp" +DAYS = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday") +MONTHS = ( + "January", + "February", + "March", + "April", + "May", + "June", + "July", + "August", + "September", + "October", + "November", + "December", +) + +# Weather Code Information from https://open-meteo.com/en/docs +# Code Description +# 0 Clear sky +# 1, 2, 3 Mainly clear, partly cloudy, and overcast +# 45, 48 Fog and depositing rime fog +# 51, 53, 55 Drizzle: Light, moderate, and dense intensity +# 56, 57 Freezing Drizzle: Light and dense intensity +# 61, 63, 65 Rain: Slight, moderate and heavy intensity +# 66, 67 Freezing Rain: Light and heavy intensity +# 71, 73, 75 Snow fall: Slight, moderate, and heavy intensity +# 77 Snow grains +# 80, 81, 82 Rain showers: Slight, moderate, and violent +# 85, 86 Snow showers slight and heavy +# 95 * Thunderstorm: Slight or moderate +# 96, 99 * Thunderstorm with slight and heavy hail + +# Map the above WMO codes to index of icon in 3x3 spritesheet +WMO_CODE_TO_ICON = ( + (0,), # 0 = sunny + (1,), # 1 = partly sunny/cloudy + (2,), # 2 = cloudy + (3,), # 3 = very cloudy + (61, 63, 65), # 4 = rain + (51, 53, 55, 80, 81, 82), # 5 = showers + (95, 96, 99), # 6 = storms + (56, 57, 66, 67, 71, 73, 75, 77, 85, 86), # 7 = snow + (45, 48), # 8 = fog and stuff +) + +magtag = MagTag() + +# ---------------------------- +# Backgrounnd bitmap +# ---------------------------- +magtag.graphics.set_background(BACKGROUND_BMP) + +# ---------------------------- +# Weather icons sprite sheet +# ---------------------------- +icons_large_bmp, icons_large_pal = adafruit_imageload.load(ICONS_LARGE_FILE) +icons_small_bmp, icons_small_pal = adafruit_imageload.load(ICONS_SMALL_FILE) + +# ///////////////////////////////////////////////////////////////////////// +# helper functions + + +def get_forecast(): + URL = f"https://api.open-meteo.com/v1/forecast?latitude={LAT}&longitude={LON}&" + URL += "daily=weather_code,temperature_2m_max,temperature_2m_min" + URL += ",sunrise,sunset,wind_speed_10m_max,wind_direction_10m_dominant" + URL += "&timeformat=unixtime" + URL += f"&timezone={TMZ}" + resp = magtag.network.fetch(URL) + return resp + + +def make_banner(x=0, y=0): + """Make a single future forecast info banner group.""" + day_of_week = label.Label(terminalio.FONT, text="DAY", color=0x000000) + day_of_week.anchor_point = (0, 0.5) + day_of_week.anchored_position = (0, 10) + + icon = displayio.TileGrid( + icons_small_bmp, + pixel_shader=icons_small_pal, + x=25, + y=0, + width=1, + height=1, + tile_width=20, + tile_height=20, + ) + + day_temp = label.Label(terminalio.FONT, text="+100F", color=0x000000) + day_temp.anchor_point = (0, 0.5) + day_temp.anchored_position = (50, 10) + + group = displayio.Group(x=x, y=y) + group.append(day_of_week) + group.append(icon) + group.append(day_temp) + + return group + + +def temperature_text(tempC): + if METRIC: + return "{:3.0f}C".format(tempC) + else: + return "{:3.0f}F".format(32.0 + 1.8 * tempC) + + +def wind_text(speedkmh, direction): + wind_dir = "N" + if direction < 337: + wind_dir = "NW" + if direction < 293: + wind_dir = "W" + if direction < 247: + wind_dir = "SW" + if direction < 202: + wind_dir = "S" + if direction < 157: + wind_dir = "SE" + if direction < 112: + wind_dir = "E" + if direction < 67: + wind_dir = "NE" + if direction < 22: + wind_dir = "N" + + wtext = f"from {wind_dir} " + + if METRIC: + wtext += "{:2.0f}kmh".format(speedkmh) + else: + wtext += "{:2.0f}mph".format(0.621371 * speedkmh) + return wtext + + +def update_today(data): + """Update today weather info.""" + # date text + s = data["daily"]["time"][0] + data["utc_offset_seconds"] + t = time.localtime(s) + today_date.text = "{} {} {}, {}".format( + DAYS[t.tm_wday].upper(), MONTHS[t.tm_mon - 1].upper(), t.tm_mday, t.tm_year + ) + # weather icon + w = data["daily"]["weather_code"][0] + today_icon[0] = next(i for i, t in enumerate(WMO_CODE_TO_ICON) if w in t) + # temperatures + today_low_temp.text = temperature_text(data["daily"]["temperature_2m_min"][0]) + today_high_temp.text = temperature_text(data["daily"]["temperature_2m_max"][0]) + # wind + s = data["daily"]["wind_speed_10m_max"][0] + d = data["daily"]["wind_direction_10m_dominant"][0] + today_wind.text = wind_text(s, d) + # sunrise/set + sr = time.localtime(data["daily"]["sunrise"][0] + data["utc_offset_seconds"]) + ss = time.localtime(data["daily"]["sunset"][0] + data["utc_offset_seconds"]) + today_sunrise.text = "{:2d}:{:02d} AM".format(sr.tm_hour, sr.tm_min) + today_sunset.text = "{:2d}:{:02d} PM".format(ss.tm_hour - 12, ss.tm_min) + + +def update_future(data): + """Update the future forecast info.""" + for i, banner in enumerate(future_banners): + # day of week + s = data["daily"]["time"][i + 1] + data["utc_offset_seconds"] + t = time.localtime(s) + banner[0].text = DAYS[t.tm_wday][:3].upper() + # weather icon + w = data["daily"]["weather_code"][i + 1] + banner[1][0] = next(x for x, t in enumerate(WMO_CODE_TO_ICON) if w in t) + # temperature + t = data["daily"]["temperature_2m_max"][i + 1] + banner[2].text = temperature_text(t) + + +def go_to_sleep(current_time_secs): + """Enter deep sleep for time needed.""" + # work in units of seconds + seconds_in_a_day = 24 * 60 * 60 + three_fifteen = (3 * 60 + 15) * 60 + # wake up 15 minutes after 3am + seconds_to_sleep = (seconds_in_a_day - current_time_secs) + three_fifteen + print( + "Sleeping for {} hours, {} minutes".format( + seconds_to_sleep // 3600, (seconds_to_sleep // 60) % 60 + ) + ) + magtag.exit_and_deep_sleep(seconds_to_sleep) + + +# =========== +# U I +# =========== +today_date = label.Label(terminalio.FONT, text="?" * 30, color=0x000000) +today_date.anchor_point = (0, 0) +today_date.anchored_position = (15, 14) + +location_name = label.Label(terminalio.FONT, color=0x000000) +if CITY: + location_name.text = f"{CITY[:16]} ({LAT:.1f},{LON:.1f})" +else: + location_name.text = f"({LAT},{LON})" + +location_name.anchor_point = (0, 0) +location_name.anchored_position = (15, 25) + +today_icon = displayio.TileGrid( + icons_large_bmp, + pixel_shader=icons_small_pal, + x=10, + y=40, + width=1, + height=1, + tile_width=70, + tile_height=70, +) + +today_low_temp = label.Label(terminalio.FONT, text="+100F", color=0x000000) +today_low_temp.anchor_point = (0.5, 0) +today_low_temp.anchored_position = (122, 60) + +today_high_temp = label.Label(terminalio.FONT, text="+100F", color=0x000000) +today_high_temp.anchor_point = (0.5, 0) +today_high_temp.anchored_position = (162, 60) + +today_wind = label.Label(terminalio.FONT, text="99m/s", color=0x000000) +today_wind.anchor_point = (0, 0.5) +today_wind.anchored_position = (110, 95) + +today_sunrise = label.Label(terminalio.FONT, text="12:12 PM", color=0x000000) +today_sunrise.anchor_point = (0, 0.5) +today_sunrise.anchored_position = (45, 117) + +today_sunset = label.Label(terminalio.FONT, text="12:12 PM", color=0x000000) +today_sunset.anchor_point = (0, 0.5) +today_sunset.anchored_position = (130, 117) + +today_banner = displayio.Group() +today_banner.append(today_date) +today_banner.append(location_name) +today_banner.append(today_icon) +today_banner.append(today_low_temp) +today_banner.append(today_high_temp) +today_banner.append(today_wind) +today_banner.append(today_sunrise) +today_banner.append(today_sunset) + +future_banners = [ + make_banner(x=210, y=18), + make_banner(x=210, y=39), + make_banner(x=210, y=60), + make_banner(x=210, y=81), + make_banner(x=210, y=102), +] + +magtag.splash.append(today_banner) +for future_banner in future_banners: + magtag.splash.append(future_banner) + +# =========== +# M A I N +# =========== +print("Fetching forecast...") +resp_data = get_forecast() +forecast_data = resp_data.json() + +print("Updating...") +update_today(forecast_data) +update_future(forecast_data) + +print("Refreshing...") +time.sleep(magtag.display.time_to_refresh + 1) +magtag.display.refresh() +time.sleep(magtag.display.time_to_refresh + 1) + +print("Sleeping...") +h, m, s = (int(t) for t in resp_data.headers["date"].split(" ")[4].split(":")) +current_time_secs = (h * 3600) + (m * 60) + (s) + forecast_data["utc_offset_seconds"] +go_to_sleep(current_time_secs) +# entire code will run again after deep sleep cycle +# similar to hitting the reset button diff --git a/Magic_AI_Storybook/listener.py b/Magic_AI_Storybook/listener.py index 908efc4ff..260f50c2b 100644 --- a/Magic_AI_Storybook/listener.py +++ b/Magic_AI_Storybook/listener.py @@ -2,15 +2,13 @@ # # SPDX-License-Identifier: MIT -from queue import Queue import time import speech_recognition as sr - class Listener: def __init__( - self, api_key, energy_threshold=300, phrase_timeout=3.0, record_timeout=30 + self, api_key, energy_threshold=300, record_timeout=30 ): self.listener_handle = None self.microphone = sr.Microphone() @@ -18,62 +16,31 @@ class Listener: self.recognizer.energy_threshold = energy_threshold self.recognizer.dynamic_energy_threshold = False self.recognizer.pause_threshold = 1 - self.last_sample = bytes() self.phrase_time = time.monotonic() - self.phrase_timeout = phrase_timeout with self.microphone as source: self.recognizer.adjust_for_ambient_noise( source ) # we only need to calibrate once, before we start listening self.record_timeout = record_timeout - self.phrase_complete = False - self.data_queue = Queue() + self._audio = None self.listener_handle = None self.api_key = api_key def listen(self, ready_callback=None): print("Start listening...") - self.phrase_complete = False - start = time.monotonic() self._start_listening() if ready_callback: ready_callback() + while ( self.listener_handle and not self.speech_waiting() - ) or not self.phrase_complete: - if self.phrase_time and time.monotonic() > start + self.phrase_timeout: - self.last_sample = bytes() - self.phrase_complete = True - self.phrase_time = time.monotonic() - start + ): + time.sleep(0.1) self.stop_listening() def _save_audio_callback(self, _, audio): print("Saving audio") - data = audio.get_raw_data() - self.data_queue.put(data) - - def _get_audio(self): - """Concatenate and convert the queued raw data back to audio and return it""" - start = time.monotonic() - if self.speech_waiting(): - self.phrase_complete = False - if self.phrase_time and time.monotonic() > start + self.phrase_timeout: - self.last_sample = bytes() - self.phrase_complete = True - self.phrase_time = time.monotonic() - start - - # Concatenate our current audio data with the latest audio data. - while self.speech_waiting(): - data = self.data_queue.get() - self.last_sample += data - - # Use AudioData to convert the raw data to wav data. - return sr.AudioData( - self.last_sample, - self.microphone.SAMPLE_RATE, - self.microphone.SAMPLE_WIDTH, - ) - return None + self._audio = audio def _start_listening(self): if not self.listener_handle: @@ -93,20 +60,19 @@ class Listener: return self.listener_handle is not None def speech_waiting(self): - return not self.data_queue.empty() + return self._audio is not None def recognize(self): - audio = self._get_audio() - if audio: + if self._audio: # Transcribe the audio data to text using Whisper print("Recognizing...") attempts = 0 while attempts < 3: try: result = self.recognizer.recognize_whisper_api( - audio, api_key=self.api_key + self._audio, api_key=self.api_key ) - + self._audio = None return result.strip() except sr.RequestError as e: print(f"Error: {e}") diff --git a/Magic_AI_Storybook/make_shortcut.py b/Magic_AI_Storybook/make_shortcut.py index 851a02c23..1b34494ee 100644 --- a/Magic_AI_Storybook/make_shortcut.py +++ b/Magic_AI_Storybook/make_shortcut.py @@ -28,6 +28,7 @@ def main(): APP_PATH = "~/Magic_AI_Storybook/story.py" APP_ICON = "~/Magic_AI_Storybook/images/magic_book_icon.png" FILENAME = "storybook.desktop" + ENV_PATH = "~/story" AUTO_START = True if os.geteuid() == 0: @@ -41,12 +42,16 @@ def main(): APP_PATH = APP_PATH.replace("~", user_homedir) APP_ICON = APP_ICON.replace("~", user_homedir) + PYTHON_PATH = "python" + if ENV_PATH is not None: + ENV_PATH = ENV_PATH.replace("~", user_homedir) + PYTHON_PATH = ENV_PATH + "/bin/" + PYTHON_PATH shortcut_template = f"""[Desktop Entry] Comment=Run {APP_TITLE} Terminal={"true" if RUN_IN_TERMINAL else "false"} Name={APP_TITLE} -Exec=sudo python {APP_PATH} +Exec=sudo -E env PATH=$PATH {PYTHON_PATH} {APP_PATH} Type=Application Icon={APP_ICON} """ diff --git a/Magic_AI_Storybook/story.py b/Magic_AI_Storybook/story.py index cd2ad2a10..825c74d79 100644 --- a/Magic_AI_Storybook/story.py +++ b/Magic_AI_Storybook/story.py @@ -16,7 +16,7 @@ from collections import deque import board import digitalio import neopixel -import openai +from openai import OpenAI import pygame from rpi_backlight import Backlight from adafruit_led_animation.animation.pulse import Pulse @@ -87,12 +87,11 @@ PARAGRAPH_SPACING = 30 # ChatGPT Parameters SYSTEM_ROLE = "You are a master AI Storyteller that can tell a story of any length." -CHATGPT_MODEL = "gpt-3.5-turbo" +CHATGPT_MODEL = "gpt-3.5-turbo" # You can also use "gpt-4", which is slower, but more accurate WHISPER_MODEL = "whisper-1" # Speech Recognition Parameters ENERGY_THRESHOLD = 300 # Energy level for mic to detect -PHRASE_TIMEOUT = 1.0 # Space between recordings for separating phrases RECORD_TIMEOUT = 30 # Maximum time in seconds to wait for speech # Do some checks and Import API keys from API_KEYS_FILE @@ -118,7 +117,10 @@ if "OPENAI_API_KEY" not in config["openai"]: if len(config["openai"]["OPENAI_API_KEY"]) < 10: print("Please set OPENAI_API_KEY in your API keys file with a valid key.") sys.exit(1) -openai.api_key = config["openai"]["OPENAI_API_KEY"] +openai = OpenAI( + # This is the default and can be omitted + api_key=config["openai"]["OPENAI_API_KEY"], +) # Check that the prompt file exists and load it if not os.path.isfile(PROMPT_FILE): @@ -250,7 +252,7 @@ class Book: # Initialize the Listener self.listener = Listener( - openai.api_key, ENERGY_THRESHOLD, PHRASE_TIMEOUT, RECORD_TIMEOUT + openai.api_key, ENERGY_THRESHOLD, RECORD_TIMEOUT ) # Preload remaining images @@ -704,18 +706,11 @@ class Book: self._sleeping = True self._set_status_color(NEOPIXEL_SLEEP_COLOR) self.sleep_check_delay = 0 - self.saved_screen = self.screen.copy() - self.screen.fill((0, 0, 0)) - pygame.display.update() self.backlight.power = False def _wake(self): # Turn on the screen self.backlight.power = True - if self.saved_screen: - self.screen.blit(self.saved_screen, (0, 0)) - pygame.display.update() - self.saved_screen = None self.sleep_check_delay = 0.1 self._set_status_color(NEOPIXEL_READING_COLOR) self._sleeping = False @@ -728,8 +723,9 @@ class Book: def _sendchat(self, prompt): response = "" print("Sending to chatGPT") + print("Prompt: ", prompt) # Package up the text to send to ChatGPT - completion = openai.ChatCompletion.create( + stream = openai.chat.completions.create( model=CHATGPT_MODEL, messages=[ {"role": "system", "content": SYSTEM_ROLE}, @@ -738,9 +734,9 @@ class Book: stream=True, ) - for chunk in completion: - if "delta" in chunk.choices[0] and "content" in chunk.choices[0]["delta"]: - response += chunk.choices[0]["delta"]["content"] + for chunk in stream: + if chunk.choices[0].delta.content is not None: + response += chunk.choices[0].delta.content if self._sleep_request: return None diff --git a/Magic_Band_Reader/code.py b/Magic_Band_Reader/code.py index 031b6bffc..707a1e24d 100755 --- a/Magic_Band_Reader/code.py +++ b/Magic_Band_Reader/code.py @@ -23,7 +23,7 @@ button.switch_to_input(pull=digitalio.Pull.DOWN) audio = audiobusio.I2SOut(bit_clock=board.D24, word_select=board.D25, data=board.A3) # Make the neopixel object -pixels = neopixel.NeoPixel(board.D6, 24, brightness=.4) +pixels = neopixel.NeoPixel(board.D6, 31, brightness=.4) # Setup the LED animations chase = Chase(pixels, speed=0.02, color=GREEN, size=4, spacing=24) diff --git a/MatrixPortal_S3_Flight_Proximity_Tracker/code.py b/MatrixPortal_S3_Flight_Proximity_Tracker/code.py index c282173a0..b3dc39f96 100755 --- a/MatrixPortal_S3_Flight_Proximity_Tracker/code.py +++ b/MatrixPortal_S3_Flight_Proximity_Tracker/code.py @@ -269,7 +269,7 @@ def update_display_with_flight_data(flight_data, icon_group, display_group): display_group.append(icon_group) # Show the updated group on the display - display.show(display_group) + display.root_group = display_group display.refresh() return text_labels @@ -287,7 +287,7 @@ def display_no_flights(): main_group.append(looking_label) # Update the display with the new group - display.show(main_group) + display.root_group = main_group display.refresh() diff --git a/Matrix_Bluetooth_Controlled_LED_Sign/code.py b/Matrix_Bluetooth_Controlled_LED_Sign/code.py index a0ac8b2cd..68edce13c 100755 --- a/Matrix_Bluetooth_Controlled_LED_Sign/code.py +++ b/Matrix_Bluetooth_Controlled_LED_Sign/code.py @@ -50,7 +50,7 @@ def update_display(text, color=0xFFFFFF): text_area.x = display.width text_area.y = 13 main_group.append(text_area) - display.show(main_group) + display.root_group = main_group while True: print("WAITING...") diff --git a/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/cloudy.bmp b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/cloudy.bmp new file mode 100755 index 000000000..0fc1fdb13 Binary files /dev/null and b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/cloudy.bmp differ diff --git a/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/moon.bmp b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/moon.bmp new file mode 100755 index 000000000..e085f74b1 Binary files /dev/null and b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/moon.bmp differ diff --git a/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/rain.bmp b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/rain.bmp new file mode 100755 index 000000000..4b5210de3 Binary files /dev/null and b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/rain.bmp differ diff --git a/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/snowy.bmp b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/snowy.bmp new file mode 100755 index 000000000..9e1df991d Binary files /dev/null and b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/snowy.bmp differ diff --git a/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/sunny.bmp b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/sunny.bmp new file mode 100755 index 000000000..115f6d802 Binary files /dev/null and b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/sunny.bmp differ diff --git a/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/thunder.bmp b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/thunder.bmp new file mode 100755 index 000000000..19875ed34 Binary files /dev/null and b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/Images/thunder.bmp differ diff --git a/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/code.py b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/code.py new file mode 100755 index 000000000..203ec0bda --- /dev/null +++ b/Matrix_Portal_S3_itsaSNAP_Daily_Forecast_Display/code.py @@ -0,0 +1,129 @@ +# SPDX-FileCopyrightText: 2024 Trevor Beaton for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import terminalio +from adafruit_matrixportal.matrixportal import MatrixPortal + +# --- Display setup --- +matrixportal = MatrixPortal(width=64, height=32, bit_depth=6, debug=True) + +# Create a label for the temperature +matrixportal.add_text( + text_font=terminalio.FONT, + text_position=(33, 24), # Positioned on the right side, near the bottom + scrolling=False, +) + +# Create a label for the weather condition +matrixportal.add_text( + text_font=terminalio.FONT, + text_position=(33, 8), # Positioned on the right side, above the temperature + scrolling=False, +) + +# Dictionary mapping weather conditions to BMP filenames +WEATHER_IMAGES = { + "Sunny": "images/sunny.bmp", + "Clear": "images/moon.bmp", + "Cldy": "images/cloudy.bmp", # Updated to use shortened version + "Drizzle": "images/rain.bmp", + "Rainy": "images/cloudy.bmp", + "Heavy rain": "images/rain.bmp", + "TStorms": "images/thunder.bmp", + "Sun showers": "images/rain.bmp", + "Snow": "images/snow.bmp", +} + +# Update this to your weather feed +WEATHER_FEED = "weather-feed" +UPDATE_DELAY = 1800 # 30 minutes + +def get_last_data(feed_key): + try: + data = matrixportal.get_io_data(feed_key) + if data: + return data[0]["value"] + except (KeyError, IndexError) as e: + print(f"Error fetching data from feed {feed_key}: {e}") + return None + +def is_daytime(hour): + return 5 <= hour < 18 # True if between 5:00 AM and 5:59 PM + +def clean_condition(condition, is_day): + condition = condition.replace("Mostly ", "").replace("Partly ", "") + condition_mapping = { + "Cloudy": "Cldy", # Added shortened version of Cloudy + "Drizzle or light rain": "Rainy", + "Heavy rain": "Rainy", + "Isolated thunderstorms": "TStorms", + "Sun showers": "Rainy", + "Scattered thunderstorms": "TStorms", + "Strong storms": "TStorms", + "Light snow": "Snow", + "Heavy snow": "Snow", + } + if condition == "Sunny" and not is_day: + return "Clear" + return condition_mapping.get(condition, condition) + +def parse_weather_data(data): + try: + _, weather_info = data.split(" at ") + time_str, weather_data = weather_info.split(" ", 1) + hour = int(time_str.split(":")[0]) + if "PM" in time_str and hour != 12: + hour += 12 + elif "AM" in time_str and hour == 12: + hour = 0 + temperature, condition = weather_data.split(" and ") + return hour, temperature, condition + except ValueError as e: + print(f"Error parsing weather data: {e}") + return None, None, None + +def update_display(): + weather_data = get_last_data(WEATHER_FEED) + if weather_data: + hour, temperature, condition = parse_weather_data(weather_data) + if hour is not None and temperature is not None and condition is not None: + is_day = is_daytime(hour) + current_condition = clean_condition(condition, is_day) + + matrixportal.set_text(temperature, 0) + matrixportal.set_text(current_condition, 1) + + # Determine which image to show based on condition and time + if current_condition == "Sunny" and is_day: + image_key = "images/sunny.bmp" + elif current_condition == "Clear" or (current_condition == "Sunny" and not is_day): + image_key = "images/moon.bmp" + else: + image_key = WEATHER_IMAGES.get(current_condition, "images/sunny.bmp") + + try: + matrixportal.set_background(image_key) + except OSError as e: + print(f"Error loading image for {current_condition}: {e}") + else: + print(f"Failed to parse weather data: {weather_data}") + matrixportal.set_text("Error", 0) + matrixportal.set_text("", 1) + else: + print("Failed to retrieve data from feed") + matrixportal.set_text("No Data", 0) + matrixportal.set_text("", 1) + +last_update = time.monotonic() +update_display() + +# Main loop +while True: + current_time = time.monotonic() + if current_time - last_update > UPDATE_DELAY: + update_display() + last_update = current_time + + time.sleep(1) # Sleep for 1 second diff --git a/Matrix_Portal_itsaSNAP_Apple_Health_Display/code.py b/Matrix_Portal_itsaSNAP_Apple_Health_Display/code.py new file mode 100755 index 000000000..f09f094ce --- /dev/null +++ b/Matrix_Portal_itsaSNAP_Apple_Health_Display/code.py @@ -0,0 +1,88 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Trevor Beaton for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +import terminalio +import displayio +from adafruit_matrixportal.matrixportal import MatrixPortal +from adafruit_display_text import label + +# --- Display setup --- +matrixportal = MatrixPortal(status_neopixel=board.NEOPIXEL, debug=True, width=64, height=64) +# Use the built-in font +font = terminalio.FONT +# Define colors +ORANGE = 0xFFA500 +WHITE = 0xFFFFFF +RED = 0xFF0000 + +# Create a Group to hold all the text areas and the heart +group = displayio.Group() + +# Create a small heart bitmap +heart_bitmap = displayio.Bitmap(7, 7, 2) +heart_palette = displayio.Palette(2) +heart_palette[0] = 0x000000 # Black (transparent) +heart_palette[1] = RED # Red heart + +# Draw the heart +heart_pixels = [ + 0,1,1,0,1,1,0, + 1,1,1,1,1,1,1, + 1,1,1,1,1,1,1, + 0,1,1,1,1,1,0, + 0,0,1,1,1,0,0, + 0,0,0,1,0,0,0, +] +for heart_idx, pixel in enumerate(heart_pixels): + heart_bitmap[heart_idx % 7, heart_idx // 7] = pixel + +# Create a TileGrid using the heart bitmap and palette +heart_tile = displayio.TileGrid(heart_bitmap, pixel_shader=heart_palette, x=56, y=1) +group.append(heart_tile) + +# Add text labels for titles and values +for label_idx in range(3): + # Title + title_label = label.Label(font, text="", color=ORANGE, x=2, y=7 + label_idx*21) + group.append(title_label) + # Value + value_label = label.Label(font, text="", color=WHITE, x=2, y=17 + label_idx*21) + group.append(value_label) + +# Add the group to the display +matrixportal.display.show(group) + +# Define feed keys for your data +TITLES = ["STEPS", "WORKOUTS", "MILES"] +VALUE_FEEDS = ["stepcount", "numofworkouts", "distance"] +UPDATE_DELAY = 1800 # Update every 30 minutes + +def get_feed_data(feed_key): + try: + data = matrixportal.get_io_data(feed_key) + if data: + return data[0]["value"] + except (ValueError, RuntimeError) as feed_error: + print(f"Error fetching data from feed {feed_key}: {feed_error}") + return None + +def update_display(): + for display_idx, (title, value_feed) in enumerate(zip(TITLES, VALUE_FEEDS)): + value = get_feed_data(value_feed) or "N/A" + group[display_idx*2 + 1].text = title # Update title + group[display_idx*2 + 2].text = str(value) # Update value + +# Initial display update +update_display() + +# Main loop +while True: + try: + time.sleep(UPDATE_DELAY) + update_display() + except (ValueError, RuntimeError) as loop_error: + print("Some error occurred, retrying! -", loop_error) + continue diff --git a/Matter_Devices_Dashboard/code.py b/Matter_Devices_Dashboard/code.py new file mode 100644 index 000000000..429da5a22 --- /dev/null +++ b/Matter_Devices_Dashboard/code.py @@ -0,0 +1,184 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import os +import ssl +import wifi +import socketpool +import microcontroller +import board +import digitalio +import displayio +from adafruit_bitmap_font import bitmap_font +from adafruit_display_text import bitmap_label +from adafruit_display_shapes.circle import Circle +from adafruit_display_shapes.roundrect import RoundRect +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff +import adafruit_minimqtt.adafruit_minimqtt as MQTT + +aio_username = os.getenv("ADAFRUIT_AIO_USERNAME") +aio_key = os.getenv("ADAFRUIT_AIO_KEY") + +# feeds! +temp_feed = aio_username + "/feeds/eve-temp" # temperature sensor +humid_feed = aio_username + "/feeds/eve-humid" # humidity sensor +lux_feed = aio_username + "/feeds/eve-light" # lux sensor +occupy_feed = aio_username + "/feeds/eve-occupy" # occupation sensor +light_feed = aio_username + "/feeds/nanoleaf" # lightstrip + +# buttons +button0 = digitalio.DigitalInOut(board.D0) +button0.direction = digitalio.Direction.INPUT +button0.pull = digitalio.Pull.UP +button0_state = False +button1 = digitalio.DigitalInOut(board.D1) +button1.direction = digitalio.Direction.INPUT +button1.pull = digitalio.Pull.DOWN +button1_state = False +button2 = digitalio.DigitalInOut(board.D2) +button2.direction = digitalio.Direction.INPUT +button2.pull = digitalio.Pull.DOWN +button2_state = False + +display = board.DISPLAY +group = displayio.Group() +display.root_group = group + +# load background bitmap +bitmap = displayio.OnDiskBitmap("/tft_bg.bmp") +tile_grid = displayio.TileGrid(bitmap, pixel_shader=bitmap.pixel_shader) +group = displayio.Group() +group.append(tile_grid) + +# bitmap font +font_file = "/roundedHeavy-26.bdf" +font = bitmap_font.load_font(font_file) +# text elements +temp_text = bitmap_label.Label(font, text="00.0°C", x=55, y=70, color=0xFFFFFF) +group.append(temp_text) +humid_text = bitmap_label.Label(font, text="00.0%", x=120, y=70, color=0xFFFFFF) +group.append(humid_text) +lux_text = bitmap_label.Label(font, text="00 lx", x=190, y=70, color=0xFFFFFF) +group.append(lux_text) +occupy_text = bitmap_label.Label(font, text="Occupied?", x=128, + y=display.height - 12, color=0xFFFFFF) +group.append(occupy_text) +onOff_circ = Circle(display.width - 12, display.height - 12, 10, fill=0xcc0000) +group.append(onOff_circ) +scene_select = RoundRect(0, 0, 42, 40, 8, fill=None, outline=0xcccc00, stroke=6) +scene_y = [0, int(display.height / 2) - int(scene_select.height / 2), + display.height - scene_select.height - 1] +group.append(scene_select) + +display.root_group = group +print() +print("Connecting to WiFi...") +# connect to your SSID +wifi.radio.connect(os.getenv('CIRCUITPY_WIFI_SSID'), os.getenv('CIRCUITPY_WIFI_PASSWORD')) +print("Connected to WiFi!") + +# pylint: disable=unused-argument +# Define callback methods which are called when events occur +def connected(client, userdata, flags, rc): # pylint: disable=unused-argument + # This function will be called when the client is connected + # successfully to the broker. + print("Connected to Adafruit IO!") + # Subscribe to all changes on feeds + client.subscribe(temp_feed) + client.subscribe(humid_feed) + client.subscribe(lux_feed) + client.subscribe(occupy_feed) + client.subscribe(light_feed) + +def disconnected(client, userdata, rc): # pylint: disable=unused-argument + # This method is called when the client is disconnected + print("Disconnected from Adafruit IO!") + +def on_message(client, topic, msg): # pylint: disable=unused-argument + # This method is called when a topic the client is subscribed to + # has a new message. + print(f"New message on topic {topic}") + +def on_temp_msg(client, topic, msg): + print(f"temp feed data: {msg}°C") + temp_text.text = f"{float(msg):.01f}°C" + +def on_humid_msg(client, topic, msg): + print(f"humid feed data: {msg}%") + humid_text.text = f"{float(msg):.01f}%" + +def on_lux_msg(client, topic, msg): + print(f"lux feed data: {msg} lx") + lux_text.text = f"{float(msg):.00f} lx" + +def on_occupy_msg(client, topic, msg): + print(f"occupation feed data: {msg}") + if msg == "1": + onOff_circ.fill = 0x00cc00 + else: + onOff_circ.fill = 0xcc0000 + +def on_light_msg(client, topic, msg): + print(f"light scene selected: {msg}") + scene_select.y = scene_y[int(msg)] + +pool = socketpool.SocketPool(wifi.radio) +ssl_context = ssl.create_default_context() +# Initialize an Adafruit IO HTTP API object +mqtt_client = MQTT.MQTT( + broker="io.adafruit.com", + port=1883, + username=aio_username, + password=aio_key, + socket_pool=pool, + ssl_context=ssl_context, +) +# Setup the callback methods above +mqtt_client.on_connect = connected +mqtt_client.on_disconnect = disconnected +mqtt_client.on_message = on_message +mqtt_client.add_topic_callback(temp_feed, on_temp_msg) +mqtt_client.add_topic_callback(humid_feed, on_humid_msg) +mqtt_client.add_topic_callback(lux_feed, on_lux_msg) +mqtt_client.add_topic_callback(occupy_feed, on_occupy_msg) +mqtt_client.add_topic_callback(light_feed, on_light_msg) + +# Connect the client to the MQTT broker. +print("Connecting to Adafruit IO...") +mqtt_client.connect() + +clock_clock = ticks_ms() +clock_timer = 5 * 1000 + +while True: + try: + if ticks_diff(ticks_ms(), clock_clock) >= clock_timer: + mqtt_client.loop(timeout=1) + clock_clock = ticks_add(clock_clock, clock_timer) + # reset button state on release + if button0.value and button0_state: + button0_state = False + if not button1.value and button1_state: + button1_state = False + if not button2.value and button2_state: + button2_state = False + # buttons change light scenes + if not button0.value and not button0_state: + mqtt_client.publish(light_feed, 0) + scene_select.y = scene_y[0] + button0_state = True + if button1.value and not button1_state: + mqtt_client.publish(light_feed, 1) + scene_select.y = scene_y[1] + button1_state = True + if button2.value and not button2_state: + mqtt_client.publish(light_feed, 2) + scene_select.y = scene_y[2] + button2_state = True + except Exception as error: # pylint: disable=broad-except + print(error) + mqtt_client.disconnect() + time.sleep(5) + microcontroller.reset() diff --git a/Matter_Devices_Dashboard/roundedHeavy-26.bdf b/Matter_Devices_Dashboard/roundedHeavy-26.bdf new file mode 100644 index 000000000..eeccb2f53 --- /dev/null +++ b/Matter_Devices_Dashboard/roundedHeavy-26.bdf @@ -0,0 +1,7673 @@ +STARTFONT 2.1 +FONT -FontForge-Ostrich Sans-Heavy-R-Normal-Sans-26-250-75-75--94-- +SIZE 25 75 75 +FONTBOUNDINGBOX 19 29 -3 -6 +COMMENT "Generated by fontforge, http://fontforge.sourceforge.net" +COMMENT "Copyright (c) 2013 by The League of Moveable Type. All rights reserved." +STARTPROPERTIES 39 +FOUNDRY "FontForge" +FAMILY_NAME "Ostrich Sans" +WEIGHT_NAME "Heavy" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "Sans" +PIXEL_SIZE 26 +POINT_SIZE 250 +RESOLUTION_X 75 +RESOLUTION_Y 75 +SPACING "" +AVERAGE_WIDTH 0 +CHARSET_REGISTRY "" +CHARSET_ENCODING "" +FONTNAME_REGISTRY "" +CHARSET_COLLECTIONS "ISO10646-1" +FONT_NAME "OstrichSans-Heavy" +FACE_NAME "Ostrich Sans Heavy" +COPYRIGHT "Copyright (c) 2013 by The League of Moveable Type. All rights reserved." +FONT_VERSION "001.001" +FONT_ASCENT 21 +FONT_DESCENT 5 +UNDERLINE_POSITION -2 +UNDERLINE_THICKNESS 2 +X_HEIGHT 17 +CAP_HEIGHT 17 +RAW_ASCENT 800 +RAW_DESCENT 200 +NORM_SPACE 5 +RELATIVE_WEIGHT 90 +RELATIVE_SETWIDTH 50 +SUPERSCRIPT_X 0 +SUPERSCRIPT_Y 9 +SUPERSCRIPT_SIZE 15 +SUBSCRIPT_X 0 +SUBSCRIPT_Y 1 +SUBSCRIPT_SIZE 15 +AVG_LOWERCASE_WIDTH 101 +AVG_UPPERCASE_WIDTH 101 +ENDPROPERTIES +CHARS 310 +STARTCHAR CR +ENCODING 13 +SWIDTH 210 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR space +ENCODING 32 +SWIDTH 210 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR exclam +ENCODING 33 +SWIDTH 143 0 +DWIDTH 4 0 +BBX 2 18 0 0 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +C0 +ENDCHAR +STARTCHAR quotedbl +ENCODING 34 +SWIDTH 212 0 +DWIDTH 6 0 +BBX 4 4 0 14 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR numbersign +ENCODING 35 +SWIDTH 592 0 +DWIDTH 15 0 +BBX 14 17 -1 0 +BITMAP +0330 +0730 +0770 +0770 +0770 +7FFC +7FFC +0EE0 +0EE0 +7FF8 +FFF8 +7FF8 +1DC0 +1DC0 +1DC0 +1980 +1980 +ENDCHAR +STARTCHAR dollar +ENCODING 36 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 21 0 -2 +BITMAP +1C00 +1C00 +7E00 +7F00 +E700 +E380 +E380 +E300 +7000 +7800 +3E00 +0F00 +0700 +E300 +E380 +E380 +FF00 +7F00 +3E00 +1C00 +1800 +ENDCHAR +STARTCHAR percent +ENCODING 37 +SWIDTH 554 0 +DWIDTH 14 0 +BBX 14 17 0 0 +BITMAP +7860 +FCE0 +FCE0 +FDC0 +FDC0 +FD80 +7B80 +3380 +0700 +0778 +06FC +0EFC +0EFC +1CFC +1CFC +18F8 +3878 +ENDCHAR +STARTCHAR ampersand +ENCODING 38 +SWIDTH 479 0 +DWIDTH 12 0 +BBX 10 18 0 0 +BITMAP +0800 +3E00 +3E00 +7700 +7700 +3700 +3E00 +3E00 +3C00 +7CC0 +7FC0 +EFC0 +E7C0 +C3C0 +E380 +FFC0 +7FC0 +3EC0 +ENDCHAR +STARTCHAR quotesingle +ENCODING 39 +SWIDTH 131 0 +DWIDTH 3 0 +BBX 2 4 0 14 +BITMAP +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR parenleft +ENCODING 40 +SWIDTH 216 0 +DWIDTH 6 0 +BBX 4 17 0 0 +BITMAP +30 +70 +60 +E0 +E0 +E0 +C0 +C0 +C0 +C0 +E0 +E0 +E0 +E0 +70 +70 +30 +ENDCHAR +STARTCHAR parenright +ENCODING 41 +SWIDTH 208 0 +DWIDTH 5 0 +BBX 4 17 0 0 +BITMAP +E0 +E0 +70 +70 +30 +30 +30 +30 +30 +30 +30 +30 +70 +70 +60 +E0 +C0 +ENDCHAR +STARTCHAR asterisk +ENCODING 42 +SWIDTH 345 0 +DWIDTH 9 0 +BBX 8 7 0 10 +BITMAP +18 +5E +FF +FE +7C +7E +64 +ENDCHAR +STARTCHAR plus +ENCODING 43 +SWIDTH 434 0 +DWIDTH 11 0 +BBX 9 9 0 4 +BITMAP +0C00 +1C00 +1C00 +FF80 +FF80 +7F80 +1C00 +1C00 +0C00 +ENDCHAR +STARTCHAR comma +ENCODING 44 +SWIDTH 135 0 +DWIDTH 4 0 +BBX 3 4 0 -1 +BITMAP +C0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR hyphen +ENCODING 45 +SWIDTH 349 0 +DWIDTH 9 0 +BBX 8 3 0 7 +BITMAP +FE +FF +7E +ENDCHAR +STARTCHAR period +ENCODING 46 +SWIDTH 131 0 +DWIDTH 3 0 +BBX 3 3 0 0 +BITMAP +C0 +E0 +C0 +ENDCHAR +STARTCHAR slash +ENCODING 47 +SWIDTH 434 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +0100 +0380 +0380 +0300 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +3000 +7000 +7000 +E000 +E000 +ENDCHAR +STARTCHAR zero +ENCODING 48 +SWIDTH 370 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +10 +7C +FE +E6 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +E6 +FE +7E +3C +ENDCHAR +STARTCHAR one +ENCODING 49 +SWIDTH 244 0 +DWIDTH 6 0 +BBX 5 18 0 0 +BITMAP +10 +38 +78 +F8 +F8 +78 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +ENDCHAR +STARTCHAR two +ENCODING 50 +SWIDTH 370 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +10 +7C +7E +E7 +E7 +E7 +07 +0E +0E +1C +3C +78 +70 +E0 +E0 +FE +FF +FF +ENDCHAR +STARTCHAR three +ENCODING 51 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 8 18 0 0 +BITMAP +10 +7C +7E +E6 +E7 +E7 +47 +0E +3E +3C +1E +06 +E7 +E7 +E7 +FE +7E +3C +ENDCHAR +STARTCHAR four +ENCODING 52 +SWIDTH 374 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +02 +07 +07 +0F +0F +1F +1F +3F +37 +77 +E7 +FF +FF +07 +07 +07 +07 +03 +ENDCHAR +STARTCHAR five +ENCODING 53 +SWIDTH 360 0 +DWIDTH 9 0 +BBX 8 18 0 0 +BITMAP +FE +FF +FE +E0 +E0 +E0 +F8 +FE +FE +E7 +E7 +47 +07 +E7 +E7 +EE +FE +7C +ENDCHAR +STARTCHAR six +ENCODING 54 +SWIDTH 362 0 +DWIDTH 9 0 +BBX 8 18 0 0 +BITMAP +18 +7E +7E +E6 +E7 +E6 +F8 +FE +FE +E6 +E7 +E7 +E7 +E7 +E6 +FE +7E +3C +ENDCHAR +STARTCHAR seven +ENCODING 55 +SWIDTH 426 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +7F80 +FFC0 +FF80 +0380 +0380 +0700 +0700 +0600 +0E00 +0E00 +1C00 +1C00 +3800 +3800 +3000 +7000 +7000 +6000 +ENDCHAR +STARTCHAR eight +ENCODING 56 +SWIDTH 382 0 +DWIDTH 10 0 +BBX 8 17 0 0 +BITMAP +7E +FF +E7 +E7 +E7 +E7 +E7 +7F +7E +FF +E7 +E7 +E7 +E7 +FF +7E +3C +ENDCHAR +STARTCHAR nine +ENCODING 57 +SWIDTH 358 0 +DWIDTH 9 0 +BBX 8 17 0 0 +BITMAP +7C +7E +EE +E7 +E7 +E7 +E7 +E7 +EF +7F +7F +07 +E7 +E6 +FE +7E +7C +ENDCHAR +STARTCHAR colon +ENCODING 58 +SWIDTH 163 0 +DWIDTH 4 0 +BBX 3 10 0 4 +BITMAP +C0 +E0 +E0 +40 +00 +00 +C0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR semicolon +ENCODING 59 +SWIDTH 147 0 +DWIDTH 4 0 +BBX 3 11 0 3 +BITMAP +C0 +E0 +E0 +C0 +00 +00 +00 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR less +ENCODING 60 +SWIDTH 292 0 +DWIDTH 8 0 +BBX 6 9 0 5 +BITMAP +0C +3C +78 +F0 +E0 +F0 +78 +3C +1C +ENDCHAR +STARTCHAR equal +ENCODING 61 +SWIDTH 362 0 +DWIDTH 9 0 +BBX 8 8 0 4 +BITMAP +FE +FF +FE +00 +00 +FE +FF +FE +ENDCHAR +STARTCHAR greater +ENCODING 62 +SWIDTH 292 0 +DWIDTH 8 0 +BBX 6 9 0 5 +BITMAP +C0 +E0 +78 +3C +1C +3C +78 +F0 +E0 +ENDCHAR +STARTCHAR question +ENCODING 63 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 8 17 0 0 +BITMAP +7C +7E +E7 +E7 +E7 +C7 +0E +0E +1C +18 +38 +38 +38 +00 +30 +38 +30 +ENDCHAR +STARTCHAR at +ENCODING 64 +SWIDTH 697 0 +DWIDTH 18 0 +BBX 16 17 0 0 +BITMAP +01C0 +0FF8 +1FFC +3C1E +798E +77E6 +6FE7 +EEE7 +ECE7 +EFEE +EFFE +E7FC +7070 +780E +3FFE +0FFC +03E0 +ENDCHAR +STARTCHAR A +ENCODING 65 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR B +ENCODING 66 +SWIDTH 386 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +70 +FE +FF +E7 +E7 +E7 +E7 +E7 +FE +FE +FF +E7 +E7 +E7 +E7 +FF +FE +FC +ENDCHAR +STARTCHAR C +ENCODING 67 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR D +ENCODING 68 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +70 +FE +FF +E7 +E7 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E7 +FF +FE +FC +ENDCHAR +STARTCHAR E +ENCODING 69 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 18 0 0 +BITMAP +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR F +ENCODING 70 +SWIDTH 358 0 +DWIDTH 9 0 +BBX 7 18 0 0 +BITMAP +FE +FE +FE +E0 +E0 +E0 +E0 +E0 +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR G +ENCODING 71 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR H +ENCODING 72 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +42 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +FF +FF +FF +E7 +E7 +E7 +E7 +E7 +E7 +E3 +ENDCHAR +STARTCHAR I +ENCODING 73 +SWIDTH 164 0 +DWIDTH 4 0 +BBX 3 18 0 0 +BITMAP +40 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR J +ENCODING 74 +SWIDTH 374 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +02 +07 +07 +07 +07 +07 +07 +07 +07 +07 +07 +07 +C7 +C7 +E7 +FE +7E +3C +ENDCHAR +STARTCHAR K +ENCODING 75 +SWIDTH 388 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +4100 +E380 +E700 +E700 +EE00 +EE00 +FC00 +F800 +F800 +F800 +F800 +FC00 +FE00 +EE00 +E700 +E700 +E380 +C380 +ENDCHAR +STARTCHAR L +ENCODING 76 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 7 18 0 0 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +FE +FE +ENDCHAR +STARTCHAR M +ENCODING 77 +SWIDTH 443 0 +DWIDTH 12 0 +BBX 9 18 0 0 +BITMAP +4100 +E180 +E380 +E380 +E380 +E380 +F380 +F780 +F780 +F780 +F780 +FF80 +FF80 +FD80 +FD80 +FD80 +FD80 +CD80 +ENDCHAR +STARTCHAR N +ENCODING 78 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR O +ENCODING 79 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR P +ENCODING 80 +SWIDTH 390 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +FC +FE +FF +E7 +E3 +E3 +E3 +E7 +FF +FE +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR Q +ENCODING 81 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +3C00 +7F00 +FF00 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +EF00 +EF00 +7F00 +7F80 +0380 +ENDCHAR +STARTCHAR R +ENCODING 82 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +ENDCHAR +STARTCHAR S +ENCODING 83 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR T +ENCODING 84 +SWIDTH 401 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +FF00 +FF80 +7F00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +0800 +ENDCHAR +STARTCHAR U +ENCODING 85 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 18 0 0 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR V +ENCODING 86 +SWIDTH 435 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +E1C0 +E1C0 +E1C0 +6180 +7380 +7380 +7380 +3300 +3700 +3F00 +3F00 +1E00 +1E00 +1E00 +1E00 +1C00 +0C00 +0C00 +ENDCHAR +STARTCHAR W +ENCODING 87 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 18 0 0 +BITMAP +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR X +ENCODING 88 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +4080 +E1C0 +E180 +7380 +7300 +3700 +3E00 +3E00 +1E00 +1C00 +1E00 +3E00 +3F00 +7700 +7380 +E380 +E1C0 +C1C0 +ENDCHAR +STARTCHAR Y +ENCODING 89 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR Z +ENCODING 90 +SWIDTH 411 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR backslash +ENCODING 92 +SWIDTH 430 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +4000 +E000 +6000 +7000 +7000 +3800 +3800 +1C00 +1C00 +1C00 +0E00 +0E00 +0700 +0700 +0700 +0380 +0380 +0180 +ENDCHAR +STARTCHAR asciicircum +ENCODING 94 +SWIDTH 237 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +30 +78 +FC +CC +ENDCHAR +STARTCHAR underscore +ENCODING 95 +SWIDTH 511 0 +DWIDTH 13 0 +BBX 12 3 0 -1 +BITMAP +FFE0 +FFF0 +7FE0 +ENDCHAR +STARTCHAR grave +ENCODING 96 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +E0 +F0 +7C +1C +ENDCHAR +STARTCHAR a +ENCODING 97 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR b +ENCODING 98 +SWIDTH 386 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +70 +FE +FF +E7 +E7 +E7 +E7 +E7 +FE +FE +FF +E7 +E7 +E7 +E7 +FF +FE +FC +ENDCHAR +STARTCHAR c +ENCODING 99 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR d +ENCODING 100 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +70 +FE +FF +E7 +E7 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E7 +FF +FE +FC +ENDCHAR +STARTCHAR e +ENCODING 101 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 18 0 0 +BITMAP +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR f +ENCODING 102 +SWIDTH 358 0 +DWIDTH 9 0 +BBX 7 18 0 0 +BITMAP +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FC +FC +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR g +ENCODING 103 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR h +ENCODING 104 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +42 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +FF +FF +FF +E7 +E7 +E7 +E7 +E7 +E7 +E3 +ENDCHAR +STARTCHAR i +ENCODING 105 +SWIDTH 164 0 +DWIDTH 4 0 +BBX 3 18 0 0 +BITMAP +40 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR j +ENCODING 106 +SWIDTH 374 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +02 +07 +07 +07 +07 +07 +07 +07 +07 +07 +07 +07 +C7 +C7 +E7 +FE +7E +3C +ENDCHAR +STARTCHAR k +ENCODING 107 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +4100 +E380 +E700 +E700 +EE00 +EE00 +FC00 +F800 +F800 +F800 +F800 +FC00 +FE00 +EE00 +E700 +E700 +E380 +C380 +ENDCHAR +STARTCHAR l +ENCODING 108 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 7 18 0 0 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +FE +FE +ENDCHAR +STARTCHAR m +ENCODING 109 +SWIDTH 443 0 +DWIDTH 12 0 +BBX 9 18 0 0 +BITMAP +4100 +E180 +E380 +E380 +E380 +E380 +F380 +F780 +F780 +F780 +F780 +FF80 +FF80 +FD80 +FD80 +FD80 +FD80 +CD80 +ENDCHAR +STARTCHAR n +ENCODING 110 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR o +ENCODING 111 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR p +ENCODING 112 +SWIDTH 390 0 +DWIDTH 10 0 +BBX 8 18 0 0 +BITMAP +70 +FE +FF +E7 +E3 +E3 +E3 +E7 +FF +FE +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR q +ENCODING 113 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 19 0 -1 +BITMAP +0800 +7E00 +FF00 +E700 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +E300 +EF00 +FF00 +7F00 +3F80 +0180 +ENDCHAR +STARTCHAR r +ENCODING 114 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 17 0 0 +BITMAP +FE00 +FF00 +E700 +E380 +E380 +E380 +E700 +FF00 +FE00 +FF00 +E700 +E300 +E300 +E300 +E300 +E300 +E300 +ENDCHAR +STARTCHAR s +ENCODING 115 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +7000 +7800 +3E00 +0F00 +0700 +E300 +E380 +E380 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR t +ENCODING 116 +SWIDTH 401 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +7F00 +FF80 +FF80 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR u +ENCODING 117 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 18 0 0 +BITMAP +40 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +FF +7F +3C +ENDCHAR +STARTCHAR v +ENCODING 118 +SWIDTH 435 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +4080 +E1C0 +E1C0 +6180 +6380 +7380 +7380 +7300 +3300 +3F00 +3F00 +3F00 +1E00 +1E00 +1E00 +1E00 +0C00 +0C00 +ENDCHAR +STARTCHAR w +ENCODING 119 +SWIDTH 555 0 +DWIDTH 14 0 +BBX 13 18 0 0 +BITMAP +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR x +ENCODING 120 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +4080 +E1C0 +E180 +7380 +7300 +3700 +3E00 +3E00 +1E00 +1C00 +1E00 +3E00 +3F00 +7700 +7380 +E380 +E1C0 +C1C0 +ENDCHAR +STARTCHAR y +ENCODING 121 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR z +ENCODING 122 +SWIDTH 411 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR bar +ENCODING 124 +SWIDTH 139 0 +DWIDTH 4 0 +BBX 3 18 0 0 +BITMAP +40 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR asciitilde +ENCODING 126 +SWIDTH 322 0 +DWIDTH 8 0 +BBX 8 3 0 17 +BITMAP +7F +FF +FE +ENDCHAR +STARTCHAR exclamdown +ENCODING 161 +SWIDTH 143 0 +DWIDTH 4 0 +BBX 2 17 0 0 +BITMAP +C0 +C0 +C0 +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR sterling +ENCODING 163 +SWIDTH 373 0 +DWIDTH 10 0 +BBX 9 17 0 0 +BITMAP +3E00 +3F00 +7300 +7200 +7000 +7000 +7000 +FE00 +FE00 +7E00 +7000 +7000 +7000 +6000 +FF00 +FF80 +FF00 +ENDCHAR +STARTCHAR dieresis +ENCODING 168 +SWIDTH 229 0 +DWIDTH 6 0 +BBX 6 3 0 19 +BITMAP +DC +DC +DC +ENDCHAR +STARTCHAR copyright +ENCODING 169 +SWIDTH 709 0 +DWIDTH 18 0 +BBX 16 18 0 0 +BITMAP +03E0 +0FF8 +1FFC +3C1E +7BCE +77E7 +67E7 +E773 +E763 +E703 +E773 +E773 +67E7 +73E7 +39CE +3FFC +0FF8 +03E0 +ENDCHAR +STARTCHAR registered +ENCODING 174 +SWIDTH 723 0 +DWIDTH 19 0 +BBX 16 18 0 0 +BITMAP +03E0 +0FF8 +1FFC +3C1E +73CE +73E7 +63E7 +E363 +E3E3 +E3E3 +E3E3 +6363 +7367 +736E +381E +1FFC +0FF8 +03E0 +ENDCHAR +STARTCHAR macron +ENCODING 175 +SWIDTH 231 0 +DWIDTH 6 0 +BBX 6 3 0 18 +BITMAP +FC +FC +78 +ENDCHAR +STARTCHAR degree +ENCODING 176 +SWIDTH 142 0 +DWIDTH 4 0 +BBX 4 3 0 17 +BITMAP +E0 +B0 +E0 +ENDCHAR +STARTCHAR acute +ENCODING 180 +SWIDTH 247 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +08 +3C +F8 +E0 +ENDCHAR +STARTCHAR periodcentered +ENCODING 183 +SWIDTH 83 0 +DWIDTH 2 0 +BBX 2 3 0 8 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR cedilla +ENCODING 184 +SWIDTH 201 0 +DWIDTH 5 0 +BBX 5 7 0 -6 +BITMAP +40 +60 +78 +78 +98 +F8 +F0 +ENDCHAR +STARTCHAR ordmasculine +ENCODING 186 +SWIDTH 140 0 +DWIDTH 4 0 +BBX 4 3 0 17 +BITMAP +E0 +B0 +E0 +ENDCHAR +STARTCHAR questiondown +ENCODING 191 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 8 17 -1 0 +BITMAP +0C +0C +0C +0C +0C +0C +1C +1C +38 +70 +70 +63 +E3 +E7 +77 +7E +3E +ENDCHAR +STARTCHAR Agrave +ENCODING 192 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +3C00 +1E00 +0700 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR Aacute +ENCODING 193 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +0F00 +1E00 +3C00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR Acircumflex +ENCODING 194 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1E00 +1F00 +3F00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR Atilde +ENCODING 195 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1800 +7F80 +7F80 +0700 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR Adieresis +ENCODING 196 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1200 +3F00 +3F00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR Aring +ENCODING 197 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1E00 +1200 +1E00 +0000 +0000 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR AE +ENCODING 198 +SWIDTH 665 0 +DWIDTH 17 0 +BBX 15 18 0 0 +BITMAP +00FC +01FE +01FE +03C0 +03C0 +07C0 +07C0 +0FC0 +0FFE +1DFE +1DFC +1FC0 +3FC0 +31C0 +71C0 +71FC +E1FE +E1FE +ENDCHAR +STARTCHAR Ccedilla +ENCODING 199 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 23 0 -5 +BITMAP +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +1800 +1E00 +1F00 +3F00 +3E00 +ENDCHAR +STARTCHAR Egrave +ENCODING 200 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 23 0 0 +BITMAP +70 +7C +1E +06 +00 +FE +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Eacute +ENCODING 201 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +1E +3C +70 +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Ecircumflex +ENCODING 202 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +38 +7C +7E +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Edieresis +ENCODING 203 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +24 +6E +6E +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Igrave +ENCODING 204 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -1 0 +BITMAP +E0 +78 +3C +00 +20 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +60 +ENDCHAR +STARTCHAR Iacute +ENCODING 205 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 5 22 -1 0 +BITMAP +38 +F8 +E0 +00 +20 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +60 +ENDCHAR +STARTCHAR Icircumflex +ENCODING 206 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -2 0 +BITMAP +38 +7C +FC +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR Idieresis +ENCODING 207 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -2 0 +BITMAP +44 +EC +EC +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR Eth +ENCODING 208 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 10 18 -2 0 +BITMAP +1C00 +3F80 +3FC0 +39C0 +39C0 +38C0 +38C0 +38C0 +FEC0 +FEC0 +7EC0 +38C0 +38C0 +38C0 +39C0 +3FC0 +3F80 +3F00 +ENDCHAR +STARTCHAR Ntilde +ENCODING 209 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +7F80 +FF00 +0E00 +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR Ograve +ENCODING 210 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +3E00 +0F00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Oacute +ENCODING 211 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1E00 +3C00 +7800 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Ocircumflex +ENCODING 212 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Otilde +ENCODING 213 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +7F00 +FF00 +0E00 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Odieresis +ENCODING 214 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +2200 +7600 +7600 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR multiply +ENCODING 215 +SWIDTH 294 0 +DWIDTH 8 0 +BBX 6 6 0 6 +BITMAP +CC +FC +7C +78 +FC +EC +ENDCHAR +STARTCHAR Oslash +ENCODING 216 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +0900 +7F80 +7F80 +E700 +E700 +E780 +EF80 +EF80 +FF80 +FF80 +FB80 +FB80 +FB80 +F380 +F300 +FF00 +FF00 +FC00 +ENDCHAR +STARTCHAR Ugrave +ENCODING 217 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +30 +3C +1E +06 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR Uacute +ENCODING 218 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +06 +1E +3C +30 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR Ucircumflex +ENCODING 219 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +18 +3C +7E +7E +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR Udieresis +ENCODING 220 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +76 +76 +76 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR Yacute +ENCODING 221 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +3800 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR Thorn +ENCODING 222 +SWIDTH 386 0 +DWIDTH 10 0 +BBX 9 18 0 0 +BITMAP +C000 +C000 +C000 +C000 +FC00 +FF00 +FF80 +C380 +C180 +C180 +C380 +FF80 +FF00 +F800 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR germandbls +ENCODING 223 +SWIDTH 376 0 +DWIDTH 10 0 +BBX 8 17 0 0 +BITMAP +3C +7E +FE +E6 +C7 +C6 +C6 +CE +DE +DE +C7 +C3 +C3 +C3 +CF +DF +DE +ENDCHAR +STARTCHAR agrave +ENCODING 224 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +3C00 +1E00 +0700 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR aacute +ENCODING 225 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +0F00 +1E00 +3C00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR acircumflex +ENCODING 226 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1E00 +1F00 +3F00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR atilde +ENCODING 227 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1800 +7F80 +7F80 +0700 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR adieresis +ENCODING 228 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1200 +3F00 +3F00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR aring +ENCODING 229 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 22 0 0 +BITMAP +1E00 +1200 +1E00 +0000 +0000 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR ae +ENCODING 230 +SWIDTH 665 0 +DWIDTH 17 0 +BBX 14 17 0 0 +BITMAP +01FC +01FC +03FC +03C0 +07C0 +07C0 +07C0 +0FFC +0DFC +1DFC +1FC0 +3FC0 +39C0 +71C0 +71C0 +E1FC +E1FC +ENDCHAR +STARTCHAR ccedilla +ENCODING 231 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 23 0 -5 +BITMAP +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +1800 +1E00 +1F00 +3F00 +3E00 +ENDCHAR +STARTCHAR egrave +ENCODING 232 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 23 0 0 +BITMAP +70 +7C +1E +06 +00 +FE +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR eacute +ENCODING 233 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +1E +3C +70 +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR ecircumflex +ENCODING 234 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +38 +7C +7E +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR edieresis +ENCODING 235 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +24 +6E +6E +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR igrave +ENCODING 236 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -1 0 +BITMAP +E0 +78 +3C +00 +20 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +60 +ENDCHAR +STARTCHAR iacute +ENCODING 237 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 5 22 -1 0 +BITMAP +38 +F8 +E0 +00 +20 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +70 +60 +ENDCHAR +STARTCHAR icircumflex +ENCODING 238 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -2 0 +BITMAP +38 +7C +FC +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR idieresis +ENCODING 239 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -2 0 +BITMAP +44 +EC +EC +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR eth +ENCODING 240 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 10 17 -2 0 +BITMAP +3F00 +3F80 +3FC0 +39C0 +39C0 +39C0 +39C0 +FFC0 +FFC0 +FFC0 +39C0 +39C0 +39C0 +39C0 +3BC0 +3F80 +3F00 +ENDCHAR +STARTCHAR ntilde +ENCODING 241 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +7F80 +FF00 +0E00 +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR ograve +ENCODING 242 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +3E00 +0F00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR oacute +ENCODING 243 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +3800 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR ocircumflex +ENCODING 244 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR otilde +ENCODING 245 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +7F00 +FF00 +0E00 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR odieresis +ENCODING 246 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +2200 +7600 +7600 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR divide +ENCODING 247 +SWIDTH 163 0 +DWIDTH 4 0 +BBX 3 10 0 4 +BITMAP +C0 +E0 +E0 +40 +00 +00 +C0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR oslash +ENCODING 248 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +0900 +7F80 +7F80 +E700 +E700 +E780 +EF80 +EF80 +FF80 +FF80 +FB80 +FB80 +FB80 +F380 +F300 +FF00 +FF00 +FC00 +ENDCHAR +STARTCHAR ugrave +ENCODING 249 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +30 +3C +1E +06 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR uacute +ENCODING 250 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +06 +1E +3C +30 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR ucircumflex +ENCODING 251 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +18 +3C +7E +7E +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR udieresis +ENCODING 252 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +76 +76 +76 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR yacute +ENCODING 253 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +3800 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR thorn +ENCODING 254 +SWIDTH 386 0 +DWIDTH 10 0 +BBX 9 17 0 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +FF00 +FF80 +C380 +C180 +C380 +FF80 +FF00 +F800 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR ydieresis +ENCODING 255 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +2200 +7600 +7600 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR Amacron +ENCODING 256 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 21 0 0 +BITMAP +3F00 +3F00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR amacron +ENCODING 257 +SWIDTH 442 0 +DWIDTH 11 0 +BBX 10 21 0 0 +BITMAP +3F00 +3F00 +0000 +0800 +0C00 +1C00 +1E00 +1E00 +1E00 +3E00 +3F00 +3F00 +3700 +3300 +7F00 +7F80 +6380 +6380 +E180 +E1C0 +E1C0 +ENDCHAR +STARTCHAR Cacute +ENCODING 262 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +3800 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR cacute +ENCODING 263 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +3800 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Ccircumflex +ENCODING 264 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR ccircumflex +ENCODING 265 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Cdotaccent +ENCODING 266 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 21 0 0 +BITMAP +1C00 +1C00 +0800 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR cdotaccent +ENCODING 267 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 21 0 0 +BITMAP +1C00 +1C00 +0800 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Ccaron +ENCODING 268 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +7E00 +3E00 +1C00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR ccaron +ENCODING 269 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +7E00 +3E00 +1C00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E300 +E000 +E000 +E000 +E000 +E000 +E380 +E300 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Dcaron +ENCODING 270 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 8 22 0 0 +BITMAP +7E +7C +38 +00 +70 +FE +FF +E7 +E7 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E7 +FF +FE +FC +ENDCHAR +STARTCHAR dcaron +ENCODING 271 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 8 22 0 0 +BITMAP +7E +7C +38 +00 +70 +FE +FF +E7 +E7 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E3 +E7 +FF +FE +FC +ENDCHAR +STARTCHAR Dcroat +ENCODING 272 +SWIDTH 418 0 +DWIDTH 11 0 +BBX 10 18 0 0 +BITMAP +3800 +7F00 +7F80 +7380 +71C0 +71C0 +71C0 +71C0 +FDC0 +FDC0 +F9C0 +71C0 +71C0 +71C0 +7180 +7F80 +7F80 +3E00 +ENDCHAR +STARTCHAR dcroat +ENCODING 273 +SWIDTH 418 0 +DWIDTH 11 0 +BBX 9 17 0 0 +BITMAP +3E00 +3F00 +3F80 +3180 +3180 +3180 +3180 +FD80 +FD80 +FD80 +3180 +3180 +3180 +3180 +3780 +3F80 +3E00 +ENDCHAR +STARTCHAR Emacron +ENCODING 274 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 21 0 0 +BITMAP +7E +7E +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR emacron +ENCODING 275 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 21 0 0 +BITMAP +7E +7E +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Ebreve +ENCODING 276 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +6E +7E +7C +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR ebreve +ENCODING 277 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +6E +7E +7C +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Edotaccent +ENCODING 278 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 21 0 0 +BITMAP +18 +18 +10 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR edotaccent +ENCODING 279 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 21 0 0 +BITMAP +18 +18 +10 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Ecaron +ENCODING 282 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +7E +7C +38 +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR ecaron +ENCODING 283 +SWIDTH 353 0 +DWIDTH 9 0 +BBX 7 22 0 0 +BITMAP +7E +7C +38 +00 +7E +FE +FE +E0 +E0 +E0 +E0 +E0 +FE +FE +FC +E0 +E0 +E0 +E0 +FE +FE +FE +ENDCHAR +STARTCHAR Gcircumflex +ENCODING 284 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR gcircumflex +ENCODING 285 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR Gbreve +ENCODING 286 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +7600 +7E00 +3E00 +0000 +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR gbreve +ENCODING 287 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 22 0 0 +BITMAP +7600 +7E00 +3E00 +0000 +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR Gdotaccent +ENCODING 288 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 21 0 0 +BITMAP +1C00 +1C00 +0800 +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR gdotaccent +ENCODING 289 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 21 0 0 +BITMAP +1C00 +1C00 +0800 +0800 +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +EF00 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +ENDCHAR +STARTCHAR Gcommaaccent +ENCODING 290 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 22 0 -5 +BITMAP +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +E700 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +0000 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR gcommaaccent +ENCODING 291 +SWIDTH 402 0 +DWIDTH 10 0 +BBX 9 22 0 -5 +BITMAP +7E00 +7F00 +E700 +E380 +E380 +E300 +E000 +E000 +E700 +EF80 +EF80 +E380 +E380 +E300 +FF00 +7F00 +3E00 +0000 +1C00 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR Hcircumflex +ENCODING 292 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 8 22 0 0 +BITMAP +3C +3E +7E +00 +42 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +FF +FF +FF +E7 +E7 +E7 +E7 +E7 +E7 +E3 +ENDCHAR +STARTCHAR hcircumflex +ENCODING 293 +SWIDTH 394 0 +DWIDTH 10 0 +BBX 8 22 0 0 +BITMAP +3C +3E +7E +00 +42 +E7 +E7 +E7 +E7 +E7 +E7 +E7 +FF +FF +FF +E7 +E7 +E7 +E7 +E7 +E7 +E3 +ENDCHAR +STARTCHAR Itilde +ENCODING 296 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 8 22 -3 0 +BITMAP +30 +FF +FF +0C +08 +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +18 +ENDCHAR +STARTCHAR itilde +ENCODING 297 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 8 22 -3 0 +BITMAP +30 +FF +FF +0C +08 +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +1C +18 +ENDCHAR +STARTCHAR Imacron +ENCODING 298 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 21 -2 0 +BITMAP +FC +FC +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR imacron +ENCODING 299 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 21 -2 0 +BITMAP +FC +FC +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR Ibreve +ENCODING 300 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -2 0 +BITMAP +EC +FC +7C +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR ibreve +ENCODING 301 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 6 22 -2 0 +BITMAP +EC +FC +7C +00 +10 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +30 +ENDCHAR +STARTCHAR Idotaccent +ENCODING 304 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 3 21 0 0 +BITMAP +E0 +E0 +40 +40 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +C0 +ENDCHAR +STARTCHAR dotlessi +ENCODING 305 +SWIDTH 159 0 +DWIDTH 4 0 +BBX 3 17 0 0 +BITMAP +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +E0 +ENDCHAR +STARTCHAR Jcircumflex +ENCODING 308 +SWIDTH 374 0 +DWIDTH 10 0 +BBX 10 22 0 0 +BITMAP +0780 +0F80 +0FC0 +0000 +0200 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +C700 +C700 +E700 +FE00 +7E00 +3C00 +ENDCHAR +STARTCHAR jcircumflex +ENCODING 309 +SWIDTH 374 0 +DWIDTH 10 0 +BBX 10 22 0 0 +BITMAP +0780 +0F80 +0FC0 +0000 +0200 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +0700 +C700 +C700 +E700 +FE00 +7E00 +3C00 +ENDCHAR +STARTCHAR Kcommaaccent +ENCODING 310 +SWIDTH 388 0 +DWIDTH 10 0 +BBX 9 23 0 -5 +BITMAP +4100 +E380 +E700 +E700 +EE00 +EE00 +FC00 +F800 +F800 +F800 +F800 +FC00 +FE00 +EE00 +E700 +E700 +E380 +C380 +0000 +1800 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR kcommaaccent +ENCODING 311 +SWIDTH 388 0 +DWIDTH 10 0 +BBX 9 23 0 -5 +BITMAP +4100 +E380 +E700 +E700 +EE00 +EE00 +FC00 +F800 +F800 +F800 +F800 +FC00 +FE00 +EE00 +E700 +E700 +E380 +C380 +0000 +1800 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR Lacute +ENCODING 313 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 9 22 -2 0 +BITMAP +3C00 +7800 +F000 +0000 +1000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3F00 +3F80 +3F80 +ENDCHAR +STARTCHAR lacute +ENCODING 314 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 9 22 -2 0 +BITMAP +3C00 +7800 +F000 +0000 +1000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3000 +3F00 +3F80 +3F80 +ENDCHAR +STARTCHAR Lcommaaccent +ENCODING 315 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 7 23 0 -5 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +FE +FE +00 +38 +38 +38 +38 +ENDCHAR +STARTCHAR lcommaaccent +ENCODING 316 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 7 23 0 -5 +BITMAP +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FC +FE +FE +00 +38 +38 +38 +38 +ENDCHAR +STARTCHAR Lcaron +ENCODING 317 +SWIDTH 335 0 +DWIDTH 9 0 +BBX 9 20 -2 1 +BITMAP +CC00 +FC00 +7800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3800 +3F80 +3F80 +3F80 +ENDCHAR +STARTCHAR Lslash +ENCODING 321 +SWIDTH 414 0 +DWIDTH 11 0 +BBX 11 17 -2 0 +BITMAP +1C00 +1C00 +1C00 +1C00 +1C00 +1F80 +1F80 +1F00 +1E00 +3C00 +7C00 +FC00 +FC00 +1C00 +1FC0 +1FE0 +1FE0 +ENDCHAR +STARTCHAR lslash +ENCODING 322 +SWIDTH 414 0 +DWIDTH 11 0 +BBX 10 17 -2 0 +BITMAP +0800 +1C00 +1C00 +1C00 +1C00 +1D00 +1F80 +1F00 +1E00 +1C00 +3C00 +7C00 +FC00 +5C00 +1C00 +1FC0 +1FC0 +ENDCHAR +STARTCHAR Nacute +ENCODING 323 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1E00 +3C00 +7800 +0000 +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR nacute +ENCODING 324 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1E00 +3C00 +7800 +0000 +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR Ncommaaccent +ENCODING 325 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 23 0 -5 +BITMAP +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +0000 +0C00 +1C00 +1C00 +0C00 +ENDCHAR +STARTCHAR ncommaaccent +ENCODING 326 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 23 0 -5 +BITMAP +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +0000 +0C00 +1C00 +1C00 +0C00 +ENDCHAR +STARTCHAR Ncaron +ENCODING 327 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +7E00 +3E00 +1C00 +0000 +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR ncaron +ENCODING 328 +SWIDTH 410 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +7E00 +3E00 +1C00 +0000 +4100 +E380 +E380 +E380 +F380 +F380 +FB80 +FB80 +FB80 +FF80 +FF80 +EF80 +EF80 +E780 +E780 +E780 +E380 +C380 +ENDCHAR +STARTCHAR Omacron +ENCODING 332 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 21 0 0 +BITMAP +7E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR omacron +ENCODING 333 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 21 0 0 +BITMAP +7E00 +7E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR Obreve +ENCODING 334 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +7600 +7E00 +3E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR obreve +ENCODING 335 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +7600 +7E00 +3E00 +0000 +0800 +7E00 +7F00 +E700 +E300 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E380 +E300 +FF00 +7F00 +3C00 +ENDCHAR +STARTCHAR OE +ENCODING 338 +SWIDTH 544 0 +DWIDTH 14 0 +BBX 12 18 0 0 +BITMAP +07E0 +3FF0 +7FF0 +7E00 +EE00 +EE00 +EE00 +EE00 +EFF0 +EFF0 +EFE0 +EE00 +EE00 +EE00 +EE00 +7FE0 +7FF0 +1FF0 +ENDCHAR +STARTCHAR oe +ENCODING 339 +SWIDTH 544 0 +DWIDTH 14 0 +BBX 12 17 0 0 +BITMAP +1FE0 +3FF0 +7FE0 +6E00 +EE00 +EE00 +EE00 +EFE0 +EFF0 +EFE0 +EE00 +EE00 +EE00 +EE00 +7E00 +7FF0 +1FE0 +ENDCHAR +STARTCHAR Racute +ENCODING 340 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +0E00 +1E00 +7C00 +7000 +0000 +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +ENDCHAR +STARTCHAR racute +ENCODING 341 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +0E00 +1E00 +7C00 +7000 +0000 +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +ENDCHAR +STARTCHAR Rcommaaccent +ENCODING 342 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 22 0 -4 +BITMAP +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +0000 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR rcommaaccent +ENCODING 343 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 22 0 -4 +BITMAP +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +0000 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR Rcaron +ENCODING 344 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +6E00 +7E00 +3C00 +1800 +0000 +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +ENDCHAR +STARTCHAR rcaron +ENCODING 345 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +6E00 +7E00 +3C00 +1800 +0000 +FC00 +FF00 +FF00 +E300 +E380 +E380 +E380 +EF00 +FF00 +FE00 +EF00 +E300 +E300 +E300 +E300 +E300 +E300 +C300 +ENDCHAR +STARTCHAR Sacute +ENCODING 346 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +0600 +1E00 +7C00 +7000 +0000 +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR sacute +ENCODING 347 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +0600 +1E00 +7C00 +7000 +0000 +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR Scircumflex +ENCODING 348 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +1C00 +3C00 +7E00 +7600 +0000 +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR scircumflex +ENCODING 349 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +1C00 +3C00 +7E00 +7600 +0000 +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR Scedilla +ENCODING 350 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 -5 +BITMAP +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +1800 +1800 +1E00 +0F00 +3F00 +1E00 +ENDCHAR +STARTCHAR scedilla +ENCODING 351 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 -5 +BITMAP +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +1800 +1800 +1E00 +0F00 +3F00 +1E00 +ENDCHAR +STARTCHAR Scaron +ENCODING 352 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +3600 +3E00 +3C00 +1C00 +0000 +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR scaron +ENCODING 353 +SWIDTH 398 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +3600 +3E00 +3C00 +1C00 +0000 +3C00 +7F00 +FF00 +E300 +E380 +E380 +F000 +7800 +3C00 +1E00 +0F00 +C700 +E380 +E380 +E300 +7F00 +7E00 +0800 +ENDCHAR +STARTCHAR Tcommaaccent +ENCODING 354 +SWIDTH 401 0 +DWIDTH 10 0 +BBX 9 22 0 -4 +BITMAP +FF00 +FF80 +7F00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +0800 +0000 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR tcommaaccent +ENCODING 355 +SWIDTH 401 0 +DWIDTH 10 0 +BBX 9 22 0 -4 +BITMAP +FF00 +FF80 +7F00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +0800 +0000 +1C00 +1C00 +1C00 +ENDCHAR +STARTCHAR Tcaron +ENCODING 356 +SWIDTH 401 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +3600 +3E00 +3C00 +1C00 +0000 +FF00 +FF80 +7F00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +0800 +ENDCHAR +STARTCHAR tcaron +ENCODING 357 +SWIDTH 401 0 +DWIDTH 10 0 +BBX 9 23 0 0 +BITMAP +3600 +3E00 +3C00 +1C00 +0000 +FF00 +FF80 +7F00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +0800 +ENDCHAR +STARTCHAR Utilde +ENCODING 360 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +7B +FF +FE +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR utilde +ENCODING 361 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +30 +FF +FF +0C +40 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +FF +7F +3C +ENDCHAR +STARTCHAR Umacron +ENCODING 362 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +3E +7E +7E +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR umacron +ENCODING 363 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 21 0 0 +BITMAP +7E +7E +00 +40 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +FF +7F +3C +ENDCHAR +STARTCHAR Ubreve +ENCODING 364 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 23 0 0 +BITMAP +24 +7E +7E +3C +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +10 +ENDCHAR +STARTCHAR ubreve +ENCODING 365 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +76 +7E +3E +00 +40 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +FF +7F +3C +ENDCHAR +STARTCHAR Uring +ENCODING 366 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 1 +BITMAP +18 +3C +3C +18 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E7 +FF +7E +ENDCHAR +STARTCHAR uring +ENCODING 367 +SWIDTH 409 0 +DWIDTH 11 0 +BBX 8 22 0 0 +BITMAP +3C +34 +3C +00 +41 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +FF +7F +3C +ENDCHAR +STARTCHAR Wcircumflex +ENCODING 372 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0700 +0F80 +1D80 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR wcircumflex +ENCODING 373 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0700 +0F80 +1D80 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR Ycircumflex +ENCODING 374 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR ycircumflex +ENCODING 375 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1C00 +3E00 +7E00 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR Ydieresis +ENCODING 376 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +2200 +7600 +7600 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR Zacute +ENCODING 377 +SWIDTH 411 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +7800 +0000 +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR zacute +ENCODING 378 +SWIDTH 411 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +0E00 +3E00 +7800 +0000 +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR Zdotaccent +ENCODING 379 +SWIDTH 411 0 +DWIDTH 11 0 +BBX 9 21 0 0 +BITMAP +1C00 +1C00 +0800 +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR zdotaccent +ENCODING 380 +SWIDTH 411 0 +DWIDTH 11 0 +BBX 9 21 0 0 +BITMAP +1C00 +1C00 +0800 +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR Zcaron +ENCODING 381 +SWIDTH 419 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +7E00 +3E00 +1C00 +0000 +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR zcaron +ENCODING 382 +SWIDTH 419 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +7E00 +3E00 +1C00 +0000 +7F00 +FF80 +FF00 +0700 +0700 +0E00 +0E00 +0C00 +1C00 +1C00 +3800 +3800 +7000 +7000 +6000 +FF00 +FF00 +FF00 +ENDCHAR +STARTCHAR AEacute +ENCODING 508 +SWIDTH 665 0 +DWIDTH 17 0 +BBX 15 22 0 0 +BITMAP +00F0 +01E0 +0380 +0000 +00FC +01FE +01FE +03C0 +03C0 +07C0 +07C0 +0FC0 +0FFE +1DFE +1DFC +1FC0 +3FC0 +31C0 +71C0 +71FC +E1FE +E1FE +ENDCHAR +STARTCHAR aeacute +ENCODING 509 +SWIDTH 665 0 +DWIDTH 17 0 +BBX 15 22 0 0 +BITMAP +00F0 +01E0 +0380 +0000 +00FC +01FE +01FE +03C0 +03C0 +07C0 +07C0 +0FC0 +0FFE +1DFE +1DFC +1FC0 +3FC0 +31C0 +71C0 +71FC +E1FE +E1FE +ENDCHAR +STARTCHAR Oslashacute +ENCODING 510 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +1E00 +3C00 +7800 +0000 +0900 +7F80 +7F80 +FF00 +FF00 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF00 +FF00 +FF00 +FC00 +ENDCHAR +STARTCHAR oslashacute +ENCODING 511 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 18 0 0 +BITMAP +0900 +7F80 +7F80 +FF00 +FF00 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF00 +FF00 +FF00 +FC00 +ENDCHAR +STARTCHAR circumflex +ENCODING 710 +SWIDTH 237 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +30 +78 +FC +DC +ENDCHAR +STARTCHAR caron +ENCODING 711 +SWIDTH 232 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +D8 +FC +78 +70 +ENDCHAR +STARTCHAR breve +ENCODING 728 +SWIDTH 241 0 +DWIDTH 6 0 +BBX 6 3 0 19 +BITMAP +CC +FC +FC +ENDCHAR +STARTCHAR dotaccent +ENCODING 729 +SWIDTH 82 0 +DWIDTH 2 0 +BBX 2 3 0 18 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR ring +ENCODING 730 +SWIDTH 140 0 +DWIDTH 4 0 +BBX 4 3 0 19 +BITMAP +E0 +B0 +E0 +ENDCHAR +STARTCHAR tilde +ENCODING 732 +SWIDTH 319 0 +DWIDTH 8 0 +BBX 8 4 0 18 +BITMAP +70 +FF +FF +0E +ENDCHAR +STARTCHAR Wgrave +ENCODING 7808 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0E00 +0780 +03C0 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR wgrave +ENCODING 7809 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0E00 +0780 +03C0 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR Wacute +ENCODING 7810 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0380 +0F80 +0E00 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR wacute +ENCODING 7811 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0380 +0F80 +0E00 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR Wdieresis +ENCODING 7812 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0880 +1D80 +1D80 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR wdieresis +ENCODING 7813 +SWIDTH 560 0 +DWIDTH 15 0 +BBX 13 22 0 0 +BITMAP +0880 +1D80 +1D80 +0000 +4210 +E738 +E730 +E730 +EF70 +6F70 +6F70 +6FF0 +7FE0 +7FE0 +7DE0 +3DE0 +3DE0 +39E0 +39E0 +39C0 +38C0 +18C0 +ENDCHAR +STARTCHAR Ygrave +ENCODING 7922 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +3E00 +0F00 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR ygrave +ENCODING 7923 +SWIDTH 406 0 +DWIDTH 11 0 +BBX 9 22 0 0 +BITMAP +3800 +3E00 +0F00 +0000 +8100 +C380 +E380 +E700 +7700 +7E00 +3E00 +3C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1C00 +1800 +ENDCHAR +STARTCHAR endash +ENCODING 8211 +SWIDTH 349 0 +DWIDTH 9 0 +BBX 8 3 0 7 +BITMAP +FE +FF +7E +ENDCHAR +STARTCHAR emdash +ENCODING 8212 +SWIDTH 349 0 +DWIDTH 9 0 +BBX 8 3 0 7 +BITMAP +FE +FF +7E +ENDCHAR +STARTCHAR quoteleft +ENCODING 8216 +SWIDTH 131 0 +DWIDTH 3 0 +BBX 2 4 0 14 +BITMAP +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR quoteright +ENCODING 8217 +SWIDTH 131 0 +DWIDTH 3 0 +BBX 2 4 0 14 +BITMAP +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR quotedblleft +ENCODING 8220 +SWIDTH 200 0 +DWIDTH 5 0 +BBX 4 4 0 14 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR quotedblright +ENCODING 8221 +SWIDTH 200 0 +DWIDTH 5 0 +BBX 4 4 0 14 +BITMAP +F0 +F0 +F0 +F0 +ENDCHAR +STARTCHAR bullet +ENCODING 8226 +SWIDTH 155 0 +DWIDTH 4 0 +BBX 4 4 0 8 +BITMAP +40 +E0 +F0 +E0 +ENDCHAR +STARTCHAR fraction +ENCODING 8260 +SWIDTH 260 0 +DWIDTH 7 0 +BBX 9 18 -1 0 +BITMAP +0100 +0380 +0700 +0700 +0600 +0E00 +0E00 +1C00 +1C00 +1800 +3800 +3800 +7000 +7000 +6000 +E000 +E000 +C000 +ENDCHAR +STARTCHAR Euro +ENCODING 8364 +SWIDTH 370 0 +DWIDTH 10 0 +BBX 10 18 -1 0 +BITMAP +0400 +1F80 +3F80 +3F80 +7000 +7000 +7000 +FF00 +FF00 +7000 +7000 +FF00 +FF00 +7000 +3080 +3FC0 +3F80 +0F00 +ENDCHAR +STARTCHAR trademark +ENCODING 8482 +SWIDTH 650 0 +DWIDTH 17 0 +BBX 16 8 0 10 +BITMAP +FE43 +FEE7 +38E7 +38EF +38FF +38DB +38DB +00C0 +ENDCHAR +STARTCHAR commaaccent +ENCODING 63171 +SWIDTH 260 0 +DWIDTH 7 0 +BBX 2 4 2 -5 +BITMAP +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Acute +ENCODING 63177 +SWIDTH 247 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +08 +3C +F8 +E0 +ENDCHAR +STARTCHAR Caron +ENCODING 63178 +SWIDTH 232 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +D8 +FC +78 +70 +ENDCHAR +STARTCHAR Dieresis +ENCODING 63179 +SWIDTH 229 0 +DWIDTH 6 0 +BBX 6 3 0 19 +BITMAP +DC +DC +DC +ENDCHAR +STARTCHAR Grave +ENCODING 63182 +SWIDTH 222 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +E0 +F0 +7C +1C +ENDCHAR +STARTCHAR Macron +ENCODING 63184 +SWIDTH 231 0 +DWIDTH 6 0 +BBX 6 3 0 18 +BITMAP +FC +FC +78 +ENDCHAR +STARTCHAR uniF8FF +ENCODING 63743 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR .notdef +ENCODING -1 +SWIDTH 210 0 +DWIDTH 5 0 +BBX 1 1 0 0 +BITMAP +00 +ENDCHAR +STARTCHAR Ring +ENCODING -1 +SWIDTH 140 0 +DWIDTH 4 0 +BBX 4 3 0 19 +BITMAP +E0 +B0 +E0 +ENDCHAR +STARTCHAR Tilde +ENCODING -1 +SWIDTH 319 0 +DWIDTH 8 0 +BBX 8 3 0 17 +BITMAP +7F +FF +FE +ENDCHAR +STARTCHAR Circumflex +ENCODING -1 +SWIDTH 237 0 +DWIDTH 6 0 +BBX 6 4 0 19 +BITMAP +30 +78 +FC +DC +ENDCHAR +STARTCHAR Cedilla +ENCODING -1 +SWIDTH 201 0 +DWIDTH 5 0 +BBX 5 7 0 -6 +BITMAP +40 +60 +78 +78 +98 +F8 +F0 +ENDCHAR +STARTCHAR commaaccent.cap +ENCODING -1 +SWIDTH 260 0 +DWIDTH 7 0 +BBX 2 4 2 -5 +BITMAP +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR Breve +ENCODING -1 +SWIDTH 241 0 +DWIDTH 6 0 +BBX 6 3 0 19 +BITMAP +CC +FC +FC +ENDCHAR +ENDFONT diff --git a/Matter_Devices_Dashboard/tft_bg.bmp b/Matter_Devices_Dashboard/tft_bg.bmp new file mode 100644 index 000000000..30586cde1 Binary files /dev/null and b/Matter_Devices_Dashboard/tft_bg.bmp differ diff --git a/Mini_GIF_Players/.none.test.only b/Mini_GIF_Players/.none.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Motion_Sensor_Bat/bat0.wav b/Motion_Sensor_Bat/bat0.wav new file mode 100644 index 000000000..06d94259a Binary files /dev/null and b/Motion_Sensor_Bat/bat0.wav differ diff --git a/Motion_Sensor_Bat/bat1.wav b/Motion_Sensor_Bat/bat1.wav new file mode 100644 index 000000000..0c9d479f0 Binary files /dev/null and b/Motion_Sensor_Bat/bat1.wav differ diff --git a/Motion_Sensor_Bat/bat2.wav b/Motion_Sensor_Bat/bat2.wav new file mode 100644 index 000000000..76eecf24f Binary files /dev/null and b/Motion_Sensor_Bat/bat2.wav differ diff --git a/Motion_Sensor_Bat/code.py b/Motion_Sensor_Bat/code.py new file mode 100644 index 000000000..77716eff5 --- /dev/null +++ b/Motion_Sensor_Bat/code.py @@ -0,0 +1,98 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import board +import audiocore +import audiobusio +import audiomixer +import pwmio +from digitalio import DigitalInOut, Direction, Pull +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff +from adafruit_motor import servo +import adafruit_vl53l1x + +distance_delay = 4 # how often vl53 is read +servo_delays = [2.0, 1.5, 1.0, 0.5] # servo spin delay +distances = [70, 50, 40, 50] # in centimeters +max_audio = 1 +# audio files +music = audiocore.WaveFile(open("music-loop-1.wav", "rb")) +fx_1 = audiocore.WaveFile(open("bat0.wav", "rb")) +fx_2 = audiocore.WaveFile(open("bat1.wav", "rb")) +fx_3 = audiocore.WaveFile(open("bat2.wav", "rb")) + +i2c = board.STEMMA_I2C() +vl53 = adafruit_vl53l1x.VL53L1X(i2c) + +tracks = [music, fx_1, fx_2, fx_3] +audio = audiobusio.I2SOut(board.I2S_BIT_CLOCK, board.I2S_WORD_SELECT, board.I2S_DATA) +mixer = audiomixer.Mixer(voice_count=4, sample_rate=22050, channel_count=1, + bits_per_sample=16, samples_signed=True) +audio.play(mixer) +mixer.voice[0].play(tracks[0], loop=True) +mixer.voice[0].level = 0.0 + +# enable external power pin +# provides power to the external components +external_power = DigitalInOut(board.EXTERNAL_POWER) +external_power.direction = Direction.OUTPUT +external_power.value = True + +switch = DigitalInOut(board.EXTERNAL_BUTTON) +switch.direction = Direction.INPUT +switch.pull = Pull.UP + +# servo control +pwm = pwmio.PWMOut(board.EXTERNAL_SERVO, duty_cycle=2 ** 15, frequency=50) +servo = servo.ContinuousServo(pwm, min_pulse=750, max_pulse=2250) + +vl53.start_ranging() + +vl53_clock = ticks_ms() +vl53_time = distance_delay * 1000 +servo_clock = ticks_ms() +servo_time = int(servo_delays[0] * 1000) +prop_time = False +servo_throttle = 0 + +while True: + if switch.value: + external_power.value = True + if prop_time: + if ticks_diff(ticks_ms(), servo_clock) >= servo_time: + print(servo_throttle) + servo.throttle = servo_throttle + servo_throttle = not servo_throttle + servo_clock = ticks_add(servo_clock, servo_time) + if ticks_diff(ticks_ms(), vl53_clock) >= vl53_time: + if vl53.data_ready: + print(f"Distance: {vl53.distance} cm") + vl53.clear_interrupt() + if vl53.distance is None: + prop_time = False + mixer.voice[0].level = 0.0 + servo_time = int(servo_delays[0] * 1000) + servo.throttle = 1.0 + else: + closest_distance = min(distances, key=lambda x: abs(vl53.distance - x)) + # print(closest_distance) + if vl53.distance <= distances[0]: + prop_time = True + mixer.voice[0].level = max_audio + else: + prop_time = False + mixer.voice[0].level = 0.0 + servo.throttle = 1.0 + if closest_distance == distances[1]: + mixer.voice[1].play(tracks[1], loop=False) + servo_time = int(servo_delays[1] * 1000) + elif closest_distance == distances[2]: + mixer.voice[2].play(tracks[2], loop=False) + servo_time = int(servo_delays[2] * 1000) + elif closest_distance == distances[3]: + mixer.voice[3].play(tracks[3], loop=False) + servo_time = int(servo_delays[3] * 1000) + vl53_clock = ticks_add(vl53_clock, vl53_time) + else: + external_power.value = False diff --git a/Motion_Sensor_Bat/music-loop-1.wav b/Motion_Sensor_Bat/music-loop-1.wav new file mode 100644 index 000000000..cb7c40f76 Binary files /dev/null and b/Motion_Sensor_Bat/music-loop-1.wav differ diff --git a/Motorized_POV_Display/blinka.bmp b/Motorized_POV_Display/blinka.bmp new file mode 100755 index 000000000..1d9c41500 Binary files /dev/null and b/Motorized_POV_Display/blinka.bmp differ diff --git a/Motorized_POV_Display/code.py b/Motorized_POV_Display/code.py new file mode 100755 index 000000000..49e113b74 --- /dev/null +++ b/Motorized_POV_Display/code.py @@ -0,0 +1,130 @@ +# SPDX-FileCopyrightText: 2017 Limor Fried for Adafruit Industries +# +# SPDX-License-Identifier: MIT +# Dotstar POV Display! Can handle up to ~2300 pixel size image (e.g. 36 x 64) + +import gc +import time +from adafruit_motorkit import MotorKit +import board +import busio +import digitalio + +kit = MotorKit(i2c=board.I2C()) + +FILENAME = "nyan-xmas.bmp" +IMAGE_DELAY = 0.001 +REPEAT = True +BRIGHTNESS = 0.3 +PIXEL_DELAY = 0.003 + +dotstar = busio.SPI(board.SCK, board.MOSI) +while not dotstar.try_lock(): + pass +dotstar.configure(baudrate=44000000) + +# we'll resize this later +databuf = bytearray(0) + +led = digitalio.DigitalInOut(board.D13) +led.switch_to_output() + +def read_le(s): + # as of this writting, int.from_bytes does not have LE support, DIY! + result = 0 + shift = 0 + for byte in bytearray(s): + result += byte << shift + shift += 8 + return result + +class BMPError(Exception): + pass + +try: + with open("/" + FILENAME, "rb") as f: + print("File opened") + if f.read(2) != b'BM': # check signature + raise BMPError("Not BitMap file") + + bmpFileSize = read_le(f.read(4)) + f.read(4) # Read & ignore creator bytes + + bmpImageoffset = read_le(f.read(4)) # Start of image data + headerSize = read_le(f.read(4)) + bmpWidth = read_le(f.read(4)) + bmpHeight = read_le(f.read(4)) + flip = True + + print("Size: %d\nImage offset: %d\nHeader size: %d" % + (bmpFileSize, bmpImageoffset, headerSize)) + print("Width: %d\nHeight: %d" % (bmpWidth, bmpHeight)) + + if read_le(f.read(2)) != 1: + raise BMPError("Not singleplane") + bmpDepth = read_le(f.read(2)) # bits per pixel + print("Bit depth: %d" % (bmpDepth)) + if bmpDepth != 24: + raise BMPError("Not 24-bit") + if read_le(f.read(2)) != 0: + raise BMPError("Compressed file") + + print("Image OK!") + + rowSize = (bmpWidth * 3 + 3) & ~3 # 32-bit line boundary + + # its huge! but its also fast :) + databuf = bytearray(bmpWidth * bmpHeight * 4) + + for row in range(bmpHeight): # For each scanline... + if flip: # Bitmap is stored bottom-to-top order (normal BMP) + pos = bmpImageoffset + (bmpHeight - 1 - row) * rowSize + else: # Bitmap is stored top-to-bottom + pos = bmpImageoffset + row * rowSize + + # print ("seek to %d" % pos) + f.seek(pos) + for col in range(bmpWidth): + b, g, r = bytearray(f.read(3)) # BMP files store RGB in BGR + # front load brightness, gamma and reordering here! + order = [b, g, r] + idx = (col * bmpHeight + (bmpHeight - row - 1)) * 4 + databuf[idx] = 0xFF # first byte is 'brightness' + idx += 1 + for color in order: + databuf[idx] = int( + pow((color * BRIGHTNESS) / 255, 2.7) * 255 + 0.5) + idx += 1 + +except BMPError as e: + print("Failed to parse BMP: " + e.args[0]) + +gc.collect() +print(gc.mem_free()) +print("Ready to go!") + +kit.motor1.throttle = 1 + +while True: + print("Draw!") + index = 0 + + for col in range(bmpWidth): + row = databuf[index:index + bmpHeight * 4] + dotstar.write(bytearray([0x00, 0x00, 0x00, 0x00])) + dotstar.write(row) + dotstar.write(bytearray([0x00, 0x00, 0x00, 0x00])) + index += bmpHeight * 4 + time.sleep(PIXEL_DELAY) + + # clear it out + dotstar.write(bytearray([0x00, 0x00, 0x00, 0x00])) + for r in range(bmpHeight * 5): + dotstar.write(bytearray([0xFF, 0x00, 0x00, 0x00])) + dotstar.write(bytearray([0xff, 0xff, 0xff, 0xff])) + gc.collect() + + if not REPEAT: + break + + time.sleep(IMAGE_DELAY) diff --git a/Motorized_POV_Display/dreidel.bmp b/Motorized_POV_Display/dreidel.bmp new file mode 100644 index 000000000..674875808 Binary files /dev/null and b/Motorized_POV_Display/dreidel.bmp differ diff --git a/Motorized_POV_Display/nyan-xmas.bmp b/Motorized_POV_Display/nyan-xmas.bmp new file mode 100755 index 000000000..cb0a9422a Binary files /dev/null and b/Motorized_POV_Display/nyan-xmas.bmp differ diff --git a/Motorized_POV_Display/pipesky.bmp b/Motorized_POV_Display/pipesky.bmp new file mode 100755 index 000000000..de986ff9c Binary files /dev/null and b/Motorized_POV_Display/pipesky.bmp differ diff --git a/Motorized_POV_Display/sans.bmp b/Motorized_POV_Display/sans.bmp new file mode 100644 index 000000000..7881970b2 Binary files /dev/null and b/Motorized_POV_Display/sans.bmp differ diff --git a/Motorized_POV_Display/xmas.bmp b/Motorized_POV_Display/xmas.bmp new file mode 100755 index 000000000..fdc22fc8f Binary files /dev/null and b/Motorized_POV_Display/xmas.bmp differ diff --git a/Motorized_POV_Display/xmastree.bmp b/Motorized_POV_Display/xmastree.bmp new file mode 100755 index 000000000..a10f439e2 Binary files /dev/null and b/Motorized_POV_Display/xmastree.bmp differ diff --git a/Neo_Trinkey_Examples/Arduino_Digital_Input/.pixeltrinkey_m0.test.only b/Neo_Trinkey_Examples/Arduino_Digital_Input/.pixeltrinkey_m0.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Neo_Trinkey_Examples/Arduino_Digital_Input/Arduino_Digital_Input.ino b/Neo_Trinkey_Examples/Arduino_Digital_Input/Arduino_Digital_Input.ino new file mode 100644 index 000000000..5cc29a1de --- /dev/null +++ b/Neo_Trinkey_Examples/Arduino_Digital_Input/Arduino_Digital_Input.ino @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: 2024 ladyada for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +Adafruit_NeoPixel pixel(1, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800); + +const int buttonPin = MISO; + +int buttonState = 0; + +void setup() { + Serial.begin(115200); + pinMode(buttonPin, INPUT); + pixel.begin(); + pixel.setBrightness(10); + pixel.show(); +} + +void loop() { + buttonState = digitalRead(buttonPin); + + if (buttonState == HIGH) { + pixel.setPixelColor(0, 0x0); + pixel.show(); + } else { + pixel.setPixelColor(0, 0xFF0000); + pixel.show(); + } + delay(100); +} diff --git a/Neo_Trinkey_Examples/Arduino_DotStar/.pixeltrinkey_m0.test.only b/Neo_Trinkey_Examples/Arduino_DotStar/.pixeltrinkey_m0.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Neo_Trinkey_Examples/Arduino_DotStar/Arduino_DotStar.ino b/Neo_Trinkey_Examples/Arduino_DotStar/Arduino_DotStar.ino new file mode 100644 index 000000000..89c01cff2 --- /dev/null +++ b/Neo_Trinkey_Examples/Arduino_DotStar/Arduino_DotStar.ino @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2024 ladyada for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +#define NUMPIXELS 64 +Adafruit_DotStar dotstrip(NUMPIXELS, PIN_DATA, PIN_CLOCK, DOTSTAR_BRG); + +void setup() { + Serial.begin(115200); + + dotstrip.begin(); + dotstrip.setBrightness(25); + dotstrip.show(); + +} + +uint16_t firstPixelHue = 0; + +void loop() { + firstPixelHue += 256; + + for(int i=0; i + +#define NUMPIXELS 64 +Adafruit_NeoPixel neostrip(NUMPIXELS, PIN_DATA, NEO_GRB + NEO_KHZ800); + +void setup() { + Serial.begin(115200); + + neostrip.begin(); + neostrip.setBrightness(25); + neostrip.show(); + +} + +uint16_t firstPixelHue = 0; + +void loop() { + firstPixelHue += 256; + for(int i=0; i +#include + +#define NEO_PIXEL_PIN PIN_DATA + +// NeoPixel-Shield has 40 neopixels +#define NEO_PIXEL_LAMP_COUNT 64 + +#define NEO_PIXEL_TYPE (NEO_GRB + NEO_KHZ800) // use "NEO_GRBW" for RGBW neopixels + +Adafruit_NeoPixel neoPixelShield = Adafruit_NeoPixel(NEO_PIXEL_LAMP_COUNT, NEO_PIXEL_PIN, NEO_PIXEL_TYPE); + +// UpdateLatency for all Lamps set to 4msec as it just seems reasonable. +#define NEO_PIXEL_LAMP_UPDATE_LATENCY (0x04) + +// The Host needs to know the location of every Lamp in the LampArray (X/Y/Z position) and other metadata. +// See "26.7 LampArray Attributes and Interrogation" https://usb.org/sites/default/files/hut1_4.pdf#page=336 +static LampAttributes neoPixelShieldLampAttributes[] PROGMEM = +{ + // All positions in millimeters from upper-left corner of device. + // All times in milliseconds. + // Id X Y Z Latency Purposes RED GRN BLUE GAIN PROGRAMMABLE? KEY + {0x00, 0x03, 0x08, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x01, 0x0C, 0x08, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x02, 0x15, 0x08, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x03, 0x1E, 0x08, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x04, 0x27, 0x08, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x05, 0x30, 0x08, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x06, 0x39, 0x08, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x07, 0x42, 0x08, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x08, 0x03, 0x13, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x09, 0x0C, 0x13, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x0A, 0x15, 0x13, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x0B, 0x1E, 0x13, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x0C, 0x27, 0x13, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x0D, 0x30, 0x13, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x0E, 0x39, 0x13, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x0F, 0x42, 0x13, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x10, 0x03, 0x1E, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x11, 0x0C, 0x1E, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x12, 0x15, 0x1E, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x13, 0x1E, 0x1E, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x14, 0x27, 0x1E, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x15, 0x30, 0x1E, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x16, 0x39, 0x1E, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x17, 0x42, 0x1E, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x18, 0x03, 0x29, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x19, 0x0C, 0x29, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x1A, 0x15, 0x29, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x1B, 0x1E, 0x29, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x1C, 0x27, 0x29, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x1D, 0x30, 0x29, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x1E, 0x39, 0x29, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x1F, 0x42, 0x29, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x20, 0x03, 0x34, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x21, 0x0C, 0x34, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x22, 0x15, 0x34, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x23, 0x1E, 0x34, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x24, 0x27, 0x34, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x25, 0x30, 0x34, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x26, 0x39, 0x34, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x27, 0x42, 0x34, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x28, 0x03, 0x3F, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x29, 0x0C, 0x3F, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x2A, 0x15, 0x3F, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x2B, 0x1E, 0x3F, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x2C, 0x27, 0x3F, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x2D, 0x30, 0x3F, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x2E, 0x39, 0x3F, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x2F, 0x42, 0x3F, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x30, 0x03, 0x4A, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x31, 0x0C, 0x4A, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x32, 0x15, 0x4A, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x33, 0x1E, 0x4A, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x34, 0x27, 0x4A, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x35, 0x30, 0x4A, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x36, 0x39, 0x4A, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x37, 0x42, 0x4A, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x38, 0x03, 0x55, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x39, 0x0C, 0x55, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x3A, 0x15, 0x55, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x3B, 0x1E, 0x55, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x3C, 0x27, 0x55, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x3D, 0x30, 0x55, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x3E, 0x39, 0x55, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00}, + {0x3F, 0x42, 0x55, 0x00, NEO_PIXEL_LAMP_UPDATE_LATENCY, LampPurposeAccent, 0xFF, 0xFF, 0xFF, 0x01, LAMP_IS_PROGRAMMABLE, 0x00} +}; +static_assert(((sizeof(neoPixelShieldLampAttributes) / sizeof(LampAttributes)) == NEO_PIXEL_LAMP_COUNT), "neoPixelShieldLampAttributes must have NEO_PIXEL_LAMP_COUNT items."); + +// All lengths in millimeters. +// All times in milliseconds. +Microsoft_HidLampArray lampArray = Microsoft_HidLampArray(NEO_PIXEL_LAMP_COUNT, 70, 55, 1, LampArrayKindPeripheral, 33, neoPixelShieldLampAttributes); + +// When the LampArray is in Autonomous-Mode, displays solid blue. +uint32_t lampArrayAutonomousColor = neoPixelShield.Color(0, 0, 1); + +void setup() +{ + // Initialize the NeoPixel library. + neoPixelShield.begin(); + neoPixelShield.clear(); + + // Always initially in Autonomous-Mode. + neoPixelShield.fill(lampArrayAutonomousColor, 0, NEO_PIXEL_LAMP_COUNT - 1); + neoPixelShield.show(); +} + +void loop() +{ + LampArrayColor currentLampArrayState[NEO_PIXEL_LAMP_COUNT]; + bool isAutonomousMode = lampArray.getCurrentState(currentLampArrayState); + + bool update = false; + + for (uint16_t i = 0; i < NEO_PIXEL_LAMP_COUNT; i++) + { + // Autonomous-Mode is the Host's mechanism to indicate to the device, that the device should decide what to render. + // The Host may do this when no application is using the LampArray, so it has nothing to render. + // In this case, this LampArray will revert to it's default/background effect, rendering 'blue'. + uint32_t newColor = isAutonomousMode ? lampArrayAutonomousColor : lampArrayColorToNeoPixelColor(currentLampArrayState[i]); + if (newColor != neoPixelShield.getPixelColor(i)) + { + neoPixelShield.setPixelColor(i, newColor); + update = true; + } + } + + // Only call update on the NeoPixels when something has changed, show() takes a long time to execute. + if (update) + { + // Send the updated pixel color to hardware. + neoPixelShield.show(); + } +} + +uint32_t lampArrayColorToNeoPixelColor(LampArrayColor lampArrayColor) +{ + return neoPixelShield.Color(lampArrayColor.RedChannel, lampArrayColor.GreenChannel, lampArrayColor.BlueChannel); +} diff --git a/Neo_Trinkey_Examples/LampArray_Pixel_Trinkey/LampArray_Pixel_Trinkey_RGBW_64.uf2 b/Neo_Trinkey_Examples/LampArray_Pixel_Trinkey/LampArray_Pixel_Trinkey_RGBW_64.uf2 new file mode 100644 index 000000000..d4cab79ad Binary files /dev/null and b/Neo_Trinkey_Examples/LampArray_Pixel_Trinkey/LampArray_Pixel_Trinkey_RGBW_64.uf2 differ diff --git a/Neo_Trinkey_Examples/LampArray_Pixel_Trinkey/LampArray_Pixel_Trinkey_RGB_64.uf2 b/Neo_Trinkey_Examples/LampArray_Pixel_Trinkey/LampArray_Pixel_Trinkey_RGB_64.uf2 new file mode 100644 index 000000000..7105e8873 Binary files /dev/null and b/Neo_Trinkey_Examples/LampArray_Pixel_Trinkey/LampArray_Pixel_Trinkey_RGB_64.uf2 differ diff --git a/Neo_Trinkey_Examples/Python_AdafruitIO_Color_Picker/Arduino_Serial_Color_Picker/.pixeltrinkey_m0.test.only b/Neo_Trinkey_Examples/Python_AdafruitIO_Color_Picker/Arduino_Serial_Color_Picker/.pixeltrinkey_m0.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Neo_Trinkey_Examples/Python_AdafruitIO_Color_Picker/Arduino_Serial_Color_Picker/Arduino_Serial_Color_Picker.ino b/Neo_Trinkey_Examples/Python_AdafruitIO_Color_Picker/Arduino_Serial_Color_Picker/Arduino_Serial_Color_Picker.ino new file mode 100644 index 000000000..5d09d7cb1 --- /dev/null +++ b/Neo_Trinkey_Examples/Python_AdafruitIO_Color_Picker/Arduino_Serial_Color_Picker/Arduino_Serial_Color_Picker.ino @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +#define NUMPIXELS 64 +Adafruit_NeoPixel neostrip(NUMPIXELS, PIN_DATA, NEO_GRB + NEO_KHZ800); + +char colorBuffer[9]; // Buffer to hold the incoming color data (0x000000) +int bufferIndex = 0; // Index for the buffer + +void setup() { + Serial.begin(115200); + + neostrip.begin(); + neostrip.setBrightness(25); + neostrip.show(); + memset(colorBuffer, 0, sizeof(colorBuffer)); // Clear the buffer +} + +void loop() { + // Check if data is available on the serial port + while (Serial.available() > 0) { + char incomingByte = Serial.read(); + + // Check if the incoming byte is part of the color data + if (isxdigit(incomingByte) || incomingByte == 'x') { + colorBuffer[bufferIndex++] = incomingByte; // Add the byte to the buffer + } + + // If the buffer is full, process the color data + if (bufferIndex == 8) { + colorBuffer[8] = '\0'; // Null-terminate the string + + // Convert the hex string to a 32-bit integer + uint32_t color = strtoul(colorBuffer, NULL, 16); + + // Extract RGB values from the color + uint8_t r = (color >> 16) & 0xFF; + uint8_t g = (color >> 8) & 0xFF; + uint8_t b = color & 0xFF; + + // Set the NeoPixels to the received color + for (int i = 0; i < NUMPIXELS; i++) { + neostrip.setPixelColor(i, neostrip.Color(r, g, b)); + } + neostrip.show(); + + // Clear the buffer and reset the bufferIndex + memset(colorBuffer, 0, sizeof(colorBuffer)); + bufferIndex = 0; + } + } +} diff --git a/Neo_Trinkey_Examples/Python_AdafruitIO_Color_Picker/Arduino_Serial_Color_Picker/Arduino_Serial_Color_Picker.uf2 b/Neo_Trinkey_Examples/Python_AdafruitIO_Color_Picker/Arduino_Serial_Color_Picker/Arduino_Serial_Color_Picker.uf2 new file mode 100644 index 000000000..04c8a82f4 Binary files /dev/null and b/Neo_Trinkey_Examples/Python_AdafruitIO_Color_Picker/Arduino_Serial_Color_Picker/Arduino_Serial_Color_Picker.uf2 differ diff --git a/Neo_Trinkey_Examples/Python_AdafruitIO_Color_Picker/code.py b/Neo_Trinkey_Examples/Python_AdafruitIO_Color_Picker/code.py new file mode 100644 index 000000000..a59997b33 --- /dev/null +++ b/Neo_Trinkey_Examples/Python_AdafruitIO_Color_Picker/code.py @@ -0,0 +1,68 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import serial +from Adafruit_IO import MQTTClient + +# Configuration +com_port = 'COM123' # Adjust this to your COM port +baud_rate = 115200 +FEED_ID = 'pixel-feed' +# Set to your Adafruit IO key. +# Remember, your key is a secret, +# so make sure not to publish it when you publish this code! +ADAFRUIT_IO_KEY = 'your-aio-key' + +# Set to your Adafruit IO username. +# (go to https://accounts.adafruit.com to find your username) +ADAFRUIT_IO_USERNAME = 'your-aio-username' + +print("Connecting to Adafruit IO...") + +# Initialize the serial connection +ser = serial.Serial(com_port, baud_rate) + +# Define callback functions +def connected(client): + client.subscribe(FEED_ID) +# pylint: disable=unused-argument, consider-using-sys-exit +def subscribe(client, userdata, mid, granted_qos): + # This method is called when the client subscribes to a new feed. + print(f"Subscribed to {FEED_ID}") + +def disconnected(client): + print('Disconnected from Adafruit IO!') + exit(1) + +def message(client, feed_id, payload): + print(f'Feed {feed_id} received new value: {payload}') + color_value = payload.strip().replace('#', '0x') # Replace # with 0x + ser.write(color_value.encode()) # Send the color value to the serial port + +# Initialize the Adafruit IO MQTT client +mqtt_client = MQTTClient(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY) + +# Setup the callback functions +mqtt_client.on_connect = connected +mqtt_client.on_disconnect = disconnected +mqtt_client.on_message = message +mqtt_client.on_subscribe = subscribe + +# Connect to Adafruit IO +mqtt_client.connect() + +# Start a background thread to listen for MQTT messages +mqtt_client.loop_blocking() + +# Keep the script running +while True: + try: + time.sleep(1) + except KeyboardInterrupt: + print('Script interrupted by user') + break + +# Close the serial connection when done +ser.close() diff --git a/Newxie_TFT_Examples/Newxie_Arduino/.uno.test.only b/Newxie_TFT_Examples/Newxie_Arduino/.uno.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Newxie_TFT_Examples/Newxie_Arduino/Newxie_Arduino.ino b/Newxie_TFT_Examples/Newxie_Arduino/Newxie_Arduino.ino new file mode 100644 index 000000000..6aa3604b6 --- /dev/null +++ b/Newxie_TFT_Examples/Newxie_Arduino/Newxie_Arduino.ino @@ -0,0 +1,676 @@ +// SPDX-FileCopyrightText: 2022 Phillip Burgess for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Graphics example for EYESPI-capable color displays. This code: +// - Functions as a "Hello World" to verify that microcontroller and screen +// are communicating. +// - Demonstrates most of the drawing commands of the Adafruit_GFX library. +// - Showcases some techniques that might not be obvious or that aren't +// built-in but can be handled with a little extra code. +// It DOES NOT: +// - Support all Adafruit screens, ONLY EYESPI products at the time this was +// written! But it's easily adapted by looking at other examples. +// - Demonstrate the Adafruit_GFX_Button class, as that's unique to +// touch-capable displays. Again, other examples may cover this topic. +// This sketch is long, but a lot of it is comments to explain each step. You +// can copy just the parts you need as a starting point for your own projects, +// and strip comments once understood. + +// CONSTANTS, HEADERS and GLOBAL VARIABLES --------------------------------- + +// *** EDIT THIS VALUE TO MATCH THE ADAFRUIT PRODUCT ID FOR YOUR DISPLAY: *** +#define SCREEN_PRODUCT_ID 6113 // Newxie 135x240 display +// You can find the product ID several ways: +// - "PID" accompanies each line-item on your receipt or order details page. +// - Visit adafruit.com and search for EYESPI displays. On product pages, +// PID is shown just below product title, and is at the end of URLs. +// - Check the comments in setup() later that reference various screens. + +// **** EDIT PINS TO MATCH YOUR WIRING **** +#define TFT_CS 10 // To display chip-select pin +#define TFT_RST -1 // To display reset pin +#define TFT_DC 8 // To display data/command pin +// For the remaining pins, this code assumes display is wired to hardware SPI +// on the dev board's primary SPI interface. The display libraries can support +// secondary SPI (if present) or bitbang (software) SPI, but that's not +// demonstrated here. See other examples for more varied interfacing options. +#include +#include // Core graphics library +#include // A custom font +#if (SCREEN_PRODUCT_ID == 1480) || (SCREEN_PRODUCT_ID == 2090) +#include // Library for ILI9341-based screens +Adafruit_ILI9341 display(TFT_CS, TFT_DC, TFT_RST); +#else +#include // Library for ST7789-based screens +Adafruit_ST7789 display(TFT_CS, TFT_DC, TFT_RST); +#endif + +#define PAUSE 3000 // Delay (millisecondss) between examples +uint8_t rotate = 0; // Current screen orientation (0-3) + +// setup() RUNS ONCE AT PROGRAM STARTUP ------------------------------------ + +void setup() { + // Initialize display hardware +#if (SCREEN_PRODUCT_ID == 5393) // 1.47" 320x172 round-rect TFT +#define CORNER_RADIUS 22 + display.init(172, 320); +#elif (SCREEN_PRODUCT_ID == 3787) // 1.54" 240x240 TFT + display.init(240, 240); +#elif (SCREEN_PRODUCT_ID == 5206) // 1.69" 280x240 round-rect TFT +#define CORNER_RADIUS 43 + display.init(240, 280); +#elif (SCREEN_PRODUCT_ID == 5394) // 1.9" 320x170 TFT + display.init(170, 320); +#elif (SCREEN_PRODUCT_ID == 6113) + display.init(135, 240); +#else // All ILI9341 TFTs (320x240) + display.begin(); +#endif +#if !defined(CORNER_RADIUS) +#define CORNER_RADIUS 0 +#endif + + // OPTIONAL: default TFT SPI speed is fairly conservative, you can try + // overriding here for faster screen updates. Actual SPI speed may be less + // depending on microcontroller's capabilities. Max reliable speed also + // depends on wiring length and tidyness. + //display.setSPISpeed(40000000); +} + +// MAIN LOOP, REPEATS FOREVER ---------------------------------------------- + +void loop() { + // Each of these functions demonstrates a different Adafruit_GFX concept: + show_shapes(); + show_charts(); + show_basic_text(); + show_char_map(); + show_custom_text(); + show_bitmap(); +#if !defined(AVR) + // The full set of examples (plus the custom font) won't fit on an 8-bit + // Arduino, something's got to go. You can try out this one IF the other + // examples are disabled instead. + show_canvas(); +#endif + + if (++rotate > 3) rotate = 0; // Cycle through screen rotations 0-3 + display.setRotation(rotate); // Takes effect on next drawing command +} + +// BASIC SHAPES EXAMPLE ---------------------------------------------------- + +void show_shapes() { + // Draw outlined and filled shapes. This demonstrates: + // - Enclosed shapes supported by GFX (points & lines are shown later). + // - Adapting to different-sized displays, and to rounded corners. + + const int16_t cx = display.width() / 2; // Center of screen = + const int16_t cy = display.height() / 2; // half of width, height + int16_t minor = min(cx, cy); // Lesser of half width or height + // Shapes will be drawn in a square region centered on the screen. But one + // particular screen -- rounded 240x280 ST7789 -- has VERY rounded corners + // that would clip a couple of shapes if drawn full size. If using that + // screen type, reduce area by a few pixels to avoid drawing in corners. + if (CORNER_RADIUS > 40) minor -= 4; + const uint8_t pad = 5; // Space between shapes is 2X this + const int16_t size = minor - pad; // Shapes are this width & height + const int16_t half = size / 2; // 1/2 of shape size + + display.fillScreen(0); // Start by clearing the screen; color 0 = black + + // Draw outline version of basic shapes: rectangle, triangle, circle and + // rounded rectangle in different colors. Rather than hardcoded numbers + // for position and size, some arithmetic helps adapt to screen dimensions. + display.drawRect(cx - minor, cy - minor, size, size, 0xF800); + display.drawTriangle(cx + pad, cy - pad, cx + pad + half, cy - minor, + cx + minor - 1, cy - pad, 0x07E0); + display.drawCircle(cx - pad - half, cy + pad + half, half, 0x001F); + display.drawRoundRect(cx + pad, cy + pad, size, size, size / 5, 0xFFE0); + delay(PAUSE); + + // Draw same shapes, same positions, but filled this time. + display.fillRect(cx - minor, cy - minor, size, size, 0xF800); + display.fillTriangle(cx + pad, cy - pad, cx + pad + half, cy - minor, + cx + minor - 1, cy - pad, 0x07E0); + display.fillCircle(cx - pad - half, cy + pad + half, half, 0x001F); + display.fillRoundRect(cx + pad, cy + pad, size, size, size / 5, 0xFFE0); + delay(PAUSE); +} // END SHAPE EXAMPLE + +// CHART EXAMPLES ---------------------------------------------------------- + +void show_charts() { + // Draw some graphs and charts. GFX library doesn't handle these as native + // object types, but it only takes a little code to build them from simple + // shapes. This demonstrates: + // - Drawing points and horizontal, vertical and arbitrary lines. + // - Adapting to different-sized displays. + // - Graphics being clipped off edge. + // - Use of negative values to draw shapes "backward" from an anchor point. + // - C technique for finding array size at runtime (vs hardcoding). + + display.fillScreen(0); // Clear screen + + const int16_t cx = display.width() / 2; // Center of screen = + const int16_t cy = display.height() / 2; // half of width, height + const int16_t minor = min(cx, cy); // Lesser of half width or height + const int16_t major = max(cx, cy); // Greater of half width or height + + // Let's start with a relatively simple sine wave graph with axes. + // Draw graph axes centered on screen. drawFastHLine() and drawFastVLine() + // need fewer arguments than normal 2-point line drawing shown later. + display.drawFastHLine(0, cy, display.width(), 0x0210); // Dark blue + display.drawFastVLine(cx, 0, display.height(), 0x0210); + + // Then draw some tick marks along the axes. To keep this code simple, + // these aren't to any particular scale, but a real program may want that. + // The loop here draws them from the center outward and pays no mind + // whether the screen is rectangular; any ticks that go off-screen will + // be clipped by the library. + for (uint8_t i=1; i<=10; i++) { + // The Arduino map() function scales an input value (e.g. "i") from an + // input range (0-10 here) to an output range (0 to major-1 here). + // Very handy for making graphics adjust to different screens! + int16_t n = map(i, 0, 10, 0, major - 1); // Tick offset relative to center point + display.drawFastVLine(cx - n, cy - 5, 11, 0x210); + display.drawFastVLine(cx + n, cy - 5, 11, 0x210); + display.drawFastHLine(cx - 5, cy - n, 11, 0x210); + display.drawFastHLine(cx - 5, cy + n, 11, 0x210); + } + + // Then draw sine wave over this using GFX drawPixel() function. + for (int16_t x=0; x(str.c_str())); +} + +// TEXT EXAMPLES ----------------------------------------------------------- + +// This section demonstrates: +// - Using the default 5x7 built-in font, including scaling in each axis. +// - How to access all characters of this font, including symbols. +// - Using a custom font, including alignment techniques that aren't a normal +// part of the GFX library (uses functions above). + +void show_basic_text() { + // Show text scaling with built-in font. + display.fillScreen(0); + display.setFont(); // Use default font + display.setCursor(0, CORNER_RADIUS); // Initial cursor position + display.setTextSize(1); // Default size + display.println(F("Standard built-in font")); + display.setTextSize(2); + display.println(F("BIG TEXT")); + display.setTextSize(3); + // "BIGGER TEXT" won't fit on narrow screens, so abbreviate there. + display.println((display.width() >= 200) ? F("BIGGER TEXT") : F("BIGGER")); + display.setTextSize(2, 4); + display.println(F("TALL and")); + display.setTextSize(4, 2); + display.println(F("WIDE")); + + delay(PAUSE); +} // END BASIC TEXT EXAMPLE + +void show_char_map() { + // "Code Page 437" is a name given to the original IBM PC character set. + // Despite age and limited language support, still seen in small embedded + // settings as it has some useful symbols and accented characters. The + // default 5x7 pixel font of Adafruit_GFX is modeled after CP437. This + // function draws a table of all the characters & explains some issues. + + // There are 256 characters in all. Draw table as 16 rows of 16 columns, + // plus hexadecimal row & column labels. How big can each cell be drawn? + const int cell_size = min(display.width(), display.height()) / 17; + if (cell_size < 8) return; // Screen is too small for table, skip example. + const int total_size = cell_size * 17; // 16 cells + 1 row or column label + + // Set up for default 5x7 font at 1:1 scale. Custom fonts are NOT used + // here as most are only 128 characters to save space (the "7b" at the + // end of many GFX font names means "7 bits," i.e. 128 characters). + display.setFont(); + display.setTextSize(1); + + // Early Adafruit_GFX was missing one symbol, throwing off some indices! + // But fixing the library would break MANY existing sketches that relied + // on the degrees symbol and others. The default behavior is thus "broken" + // to keep older code working. New code can access the CORRECT full CP437 + // table by calling this function like so: + display.cp437(true); + + display.fillScreen(0); + + const int16_t x = (display.width() - total_size) / 2; // Upper left corner of + int16_t y = (display.height() - total_size) / 2; // table centered on screen + if (y >= 4) { // If there's a little extra space above & below, scoot table + y += 4; // down a few pixels and show a message centered at top. + display.setCursor((display.width() - 114) / 2, 0); // 114 = pixel width + display.print(F("CP437 Character Map")); // of this message + } + + const int16_t inset_x = (cell_size - 5) / 2; // To center each character within cell, + const int16_t inset_y = (cell_size - 8) / 2; // compute X & Y offset from corner. + + for (uint8_t row=0; row<16; row++) { // 16 down... + // Draw row and columm headings as hexadecimal single digits. To get the + // hex value for a specific character, combine the left & top labels, + // e.g. Pi symbol is row E, column 3, thus: display.print((char)0xE3); + display.setCursor(x + (row + 1) * cell_size + inset_x, y + inset_y); + display.print(row, HEX); // This actually draws column labels + display.setCursor(x + inset_x, y + (row + 1) * cell_size + inset_y); + display.print(row, HEX); // and THIS is the row labels + for (uint8_t col=0; col<16; col++) { // 16 across... + if ((row + col) & 1) { // Fill alternating cells w/gray + display.fillRect(x + (col + 1) * cell_size, y + (row + 1) * cell_size, + cell_size, cell_size, 0x630C); + } + // drawChar() bypasses usual cursor positioning to go direct to an X/Y + // location. If foreground & background match, it's drawn transparent. + display.drawChar(x + (col + 1) * cell_size + inset_x, + y + (row + 1) * cell_size + inset_y, row * 16 + col, + 0xFFFF, 0xFFFF, 1); + } + } + + delay(PAUSE * 2); +} // END CHAR MAP EXAMPLE + +void show_custom_text() { + // Show use of custom fonts, plus how to do center or right alignment + // using some additional functions provided earlier. + + display.fillScreen(0); + display.setFont(&FreeSansBold18pt7b); + display.setTextSize(1); + display.setTextWrap(false); // Allow text off edges + + // Get "M height" of custom font and move initial base line there: + uint16_t w, h; + int16_t x, y; + display.getTextBounds("M", 0, 0, &x, &y, &w, &h); + // On rounded 240x280 display in tall orientation, "Custom Font" gets + // clipped by top corners. Scoot text down a few pixels in that one case. + if (CORNER_RADIUS && (display.height() == 280)) h += 20; + display.setCursor(display.width() / 2, h); + + if (display.width() >= 200) { + print_aligned(display, F("Custom Font"), GFX_ALIGN_CENTER); + display.setCursor(0, display.getCursorY() + 10); + print_aligned(display, F("Align Left"), GFX_ALIGN_LEFT); + display.setCursor(display.width() / 2, display.getCursorY()); + print_aligned(display, F("Centered"), GFX_ALIGN_CENTER); + // Small rounded screen, when oriented the wide way, "Right" gets + // clipped by bottom right corner. Scoot left to compensate. + int16_t x_offset = (CORNER_RADIUS && (display.height() < 200)) ? 15 : 0; + display.setCursor(display.width() - x_offset, display.getCursorY()); + print_aligned(display, F("Align Right"), GFX_ALIGN_RIGHT); + } else { + // On narrow screens, use abbreviated messages + print_aligned(display, F("Font &"), GFX_ALIGN_CENTER); + print_aligned(display, F("Align"), GFX_ALIGN_CENTER); + display.setCursor(0, display.getCursorY() + 10); + print_aligned(display, F("Left"), GFX_ALIGN_LEFT); + display.setCursor(display.width() / 2, display.getCursorY()); + print_aligned(display, F("Center"), GFX_ALIGN_CENTER); + display.setCursor(display.width(), display.getCursorY()); + print_aligned(display, F("Right"), GFX_ALIGN_RIGHT); + } + + delay(PAUSE); +} // END CUSTOM FONT EXAMPLE + +// BITMAP EXAMPLE ---------------------------------------------------------- + +// This section demonstrates: +// - Embedding a small bitmap in the code (flash memory). +// - Drawing that bitmap in various colors, and transparently (only '1' bits +// are drawn; '0' bits are skipped, leaving screen contents in place). +// - Use of the color565() function to decimate 24-bit RGB to 16 bits. + +#define HEX_WIDTH 16 // Bitmap width in pixels +#define HEX_HEIGHT 16 // Bitmap height in pixels +// Bitmap data. PROGMEM ensures it's in flash memory (not RAM). And while +// it would be valid to leave the brackets empty here (i.e. hex_bitmap[]), +// having dimensions with a little math makes the compiler verify the +// correct number of bytes are present in the list. +PROGMEM const uint8_t hex_bitmap[(HEX_WIDTH + 7) / 8 * HEX_HEIGHT] = { + 0b00000001, 0b10000000, + 0b00000111, 0b11100000, + 0b00011111, 0b11111000, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b00011111, 0b11111000, + 0b00000111, 0b11100000, + 0b00000001, 0b10000000, +}; +#define Y_SPACING (HEX_HEIGHT - 2) // Used by code below for positioning + +void show_bitmap() { + display.fillScreen(0); + + // Not screen center, but UL coordinates of center hexagon bitmap + const int16_t center_x = (display.width() - HEX_WIDTH) / 2; + const int16_t center_y = (display.height() - HEX_HEIGHT) / 2; + const uint8_t steps = min((display.height() - HEX_HEIGHT) / Y_SPACING, + display.width() / HEX_WIDTH - 1) / 2; + + display.drawBitmap(center_x, center_y, hex_bitmap, HEX_WIDTH, HEX_HEIGHT, + 0xFFFF); // Draw center hexagon in white + + // Tile the hexagon bitmap repeatedly in a range of hues. Don't mind the + // bit of repetition in the math, the optimizer easily picks this up. + // Also, if math looks odd, keep in mind "PEMDAS" operator precedence; + // multiplication and division occur before addition and subtraction. + for (uint8_t a=0; a<=steps; a++) { + for (uint8_t b=1; b<=steps; b++) { + display.drawBitmap( // Right section centered red: a = green, b = blue + center_x + (a + b) * HEX_WIDTH / 2, + center_y + (a - b) * Y_SPACING, + hex_bitmap, HEX_WIDTH, HEX_HEIGHT, + display.color565(255, 255 - 255 * a / steps, 255 - 255 * b / steps)); + display.drawBitmap( // UL section centered green: a = blue, b = red + center_x - b * HEX_WIDTH + a * HEX_WIDTH / 2, + center_y - a * Y_SPACING, + hex_bitmap, HEX_WIDTH, HEX_HEIGHT, + display.color565(255 - 255 * b / steps, 255, 255 - 255 * a / steps)); + display.drawBitmap( // LL section centered blue: a = red, b = green + center_x - a * HEX_WIDTH + b * HEX_WIDTH / 2, + center_y + b * Y_SPACING, + hex_bitmap, HEX_WIDTH, HEX_HEIGHT, + display.color565(255 - 255 * a / steps, 255 - 255 * b / steps, 255)); + } + } + + delay(PAUSE); +} // END BITMAP EXAMPLE + +// CANVAS EXAMPLE ---------------------------------------------------------- + +// This section demonstrates: +// - How to refresh changing values onscreen without erase/redraw flicker. +// - Using an offscreen canvas. It's similar to a bitmap above, but rather +// than a fixed pattern in flash memory, it's drawable like the screen. +// - More tips on text alignment, and adapting to different screen sizes. + +#define PADDING 6 // Pixels between axis label and value + +void show_canvas() { + // For this example, let's suppose we want to display live readings from a + // sensor such as a three-axis accelerometer, something like: + // X: (number) + // Y: (number) + // Z: (number) + // To look extra classy, we want a custom font, and the labels for each + // axis are right-aligned so the ':' characters line up... + + display.setFont(&FreeSansBold18pt7b); // Use a custom font + display.setTextSize(1); // and reset to 1:1 scale + + const char *label[] = { "X:", "Y:", "Z:" }; // Labels for each axis + const uint16_t color[] = { 0xF800, 0x07E0, 0x001F }; // Colors for each value + + // To get the labels right-aligned, one option would be simple trial and + // error to find a column that looks good and doesn't clip anything off. + // Let's do this dynamically though, so it adapts to any font or labels! + // Start by finding the widest of the label strings: + uint16_t w, h, max_w = 0; + int16_t x, y; + for (uint8_t i=0; i<3; i++) { // For each label... + display.getTextBounds(label[i], 0, 0, &x, &y, &w, &h); + if (w > max_w) max_w = w; // Keep track of widest label + } + + // Rounded corners throwing us a curve again. If needed, scoot everything + // to the right a bit on wide displays, down a bit on tall ones. + int16_t y_offset = 0; + if (display.width() > display.height()) max_w += CORNER_RADIUS; + else y_offset = CORNER_RADIUS; + + // Now we have max_w for right-aligning the labels. Before we draw them + // though...in order to perform flicker-free updates, the numbers we show + // will be rendered in either a GFXcanvas1 or GFXcanvas16 object; a 1-bit + // or 16-bit offscreen bitmap, RAM permitting. The correct size for this + // canvas could also be trial-and-errored, but again let's make this adapt + // automatically. The width of the canvas will span from max_w (plus a few + // pixels for padding) to the right edge. But the height? Looking at an + // uppercase 'M' can work in many situations, but some fonts have ascenders + // and descenders on digits, and in some locales a comma (extending below + // the baseline) is the decimal separator. Feed ALL the numeric chars into + // getTextBounds() for a cumulative height: + display.setTextWrap(false); // Keep on one line + display.getTextBounds(F("0123456789.,-"), 0, 0, &x, &y, &w, &h); + + // Now declare a GFXcanvas16 object based on the computed width & height: + GFXcanvas16 canvas16(display.width() - max_w - PADDING, h); + + // Small devices (e.g. ATmega328p) will almost certainly lack enough RAM + // for the canvas. Check if canvas buffer exists. If not, fall back on + // using a 1-bit (rather than 16-bit) canvas. Much more RAM friendly, but + // not as fast to draw. If a project doesn't require super interactive + // updates, consider just going straight for the more compact Canvas1. + if (canvas16.getBuffer()) { + // If here, 16-bit canvas allocated successfully! Point of interest, + // only one canvas is needed for this example, we can reuse it for all + // three numbers because the regions are the same size. + + // display and canvas are independent drawable objects; must explicitly + // set the same custom font to use on the canvas now: + canvas16.setFont(&FreeSansBold18pt7b); + + // Clear display and print labels. Once drawn, these remain untouched. + display.fillScreen(0); + display.setCursor(max_w, -y + y_offset); // Set baseline for first row + for (uint8_t i=0; i<3; i++) print_aligned(display, label[i], GFX_ALIGN_RIGHT); + + // Last part now is to print numbers on the canvas and copy the canvas to + // the display, repeating for several seconds... + uint32_t elapsed, startTime = millis(); + while ((elapsed = (millis() - startTime)) <= PAUSE * 2) { + for (uint8_t i=0; i<3; i++) { // For each label... + canvas16.fillScreen(0); // fillScreen() in this case clears canvas + canvas16.setCursor(0, -y); // Reset baseline for custom font + canvas16.setTextColor(color[i]); + // These aren't real accelerometer readings, just cool-looking numbers. + // Notice we print to the canvas, NOT the display: + canvas16.print(sin(elapsed / 200.0 + (float)i * M_PI * 2.0 / 3.0), 5); + // And HERE is the secret sauce to flicker-free updates. Canvas details + // can be passed to the drawRGBBitmap() function, which fully overwrites + // prior screen contents in that area. yAdvance is font line spacing. + display.drawRGBBitmap(max_w + PADDING, i * FreeSansBold18pt7b.yAdvance + + y_offset, canvas16.getBuffer(), canvas16.width(), + canvas16.height()); + } + } + } else { + // Insufficient RAM for Canvas16. Try declaring a 1-bit canvas instead... + GFXcanvas1 canvas1(display.width() - max_w - PADDING, h); + // If even this smaller object fails, can't proceed, cancel this example. + if (!canvas1.getBuffer()) return; + + // Remainder here is nearly identical to the code above, simply using a + // different canvas type. It's stripped of most comments for brevity. + canvas1.setFont(&FreeSansBold18pt7b); + display.fillScreen(0); + display.setCursor(max_w, -y + y_offset); + for (uint8_t i=0; i<3; i++) print_aligned(display, label[i], GFX_ALIGN_RIGHT); + uint32_t elapsed, startTime = millis(); + while ((elapsed = (millis() - startTime)) <= PAUSE * 2) { + for (uint8_t i=0; i<3; i++) { + canvas1.fillScreen(0); + canvas1.setCursor(0, -y); + canvas1.print(sin(elapsed / 200.0 + (float)i * M_PI * 2.0 / 3.0), 5); + // Here's the secret sauce to flicker-free updates with GFXcanvas1. + // Canvas details can be passed to the drawBitmap() function, and by + // specifying both a foreground AND BACKGROUND color (0), this will fully + // overwrite/erase prior screen contents in that area (vs transparent). + display.drawBitmap(max_w + PADDING, i * FreeSansBold18pt7b.yAdvance + + y_offset, canvas1.getBuffer(), canvas1.width(), + canvas1.height(), color[i], 0); + } + } + } + + // Because canvas object was declared locally to this function, it's freed + // automatically when the function returns; no explicit delete needed. +} // END CANVAS EXAMPLE diff --git a/Newxie_TFT_Examples/Newxie_CircuitPython/Helvetica-Bold-16.pcf b/Newxie_TFT_Examples/Newxie_CircuitPython/Helvetica-Bold-16.pcf new file mode 100644 index 000000000..deb9092d1 Binary files /dev/null and b/Newxie_TFT_Examples/Newxie_CircuitPython/Helvetica-Bold-16.pcf differ diff --git a/Newxie_TFT_Examples/Newxie_CircuitPython/adabot.bmp b/Newxie_TFT_Examples/Newxie_CircuitPython/adabot.bmp new file mode 100644 index 000000000..1d24f8dcc Binary files /dev/null and b/Newxie_TFT_Examples/Newxie_CircuitPython/adabot.bmp differ diff --git a/Newxie_TFT_Examples/Newxie_CircuitPython/code.py b/Newxie_TFT_Examples/Newxie_CircuitPython/code.py new file mode 100644 index 000000000..17f510e31 --- /dev/null +++ b/Newxie_TFT_Examples/Newxie_CircuitPython/code.py @@ -0,0 +1,326 @@ +# SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries +# SPDX-FileCopyrightText: Adapted from Phil B.'s 16bit_hello Arduino Code +# +# SPDX-License-Identifier: MIT + +'''Graphics example for the Vertical Newxie TFT''' + +import gc +import math +from random import randint +import time +import displayio +import board +import vectorio +import terminalio +import simpleio +from adafruit_st7789 import ST7789 +from adafruit_bitmap_font import bitmap_font +from adafruit_display_text import label, wrap_text_to_lines +from adafruit_display_shapes.rect import Rect +from adafruit_display_shapes.circle import Circle +from adafruit_display_shapes.roundrect import RoundRect +from adafruit_display_shapes.triangle import Triangle +from adafruit_display_shapes.line import Line + +displayio.release_displays() + +spi = board.SPI() +tft_cs = board.D5 +tft_dc = board.D6 + +display_bus = displayio.FourWire( + spi, command=tft_dc, chip_select=tft_cs, reset=None +) + +display = ST7789(display_bus, rotation=180, width=135, height=240, rowstart=40, colstart=53) + +bitmap = displayio.Bitmap(display.width, display.height, 3) + +red = 0xff0000 +yellow = 0xcccc00 +orange = 0xff5500 +blue = 0x0000ff +pink = 0xff00ff +purple = 0x5500ff +white = 0xffffff +green = 0x00ff00 +aqua = 0x125690 + +palette = displayio.Palette(3) +palette[0] = 0x000000 # black +palette[1] = white +palette[2] = yellow + +palette.make_transparent(0) + +tile_grid = displayio.TileGrid(bitmap, pixel_shader=palette) + +group = displayio.Group() + +def clean_up(group_name): + for _ in range(len(group_name)): + group_name.pop() + gc.collect() + +def show_shapes(): + gc.collect() + cx = int(display.width / 2) + cy = int(display.height / 2) + minor = min(cx, cy) + pad = 5 + size = minor - pad + half = int(size / 2) + rect = Rect(cx - minor, cy - minor, size, size, stroke = 1, fill=red, outline = red) + tri = Triangle(cx + pad, cy - pad, cx + pad + half, cy - minor, + cx + minor - 1, cy - pad, fill=green, outline = green) + circ = Circle(cx - pad - half, cy + pad + half, half, fill=blue, stroke = 1, outline = blue) + rnd = RoundRect(cx + pad, cy + pad, size, size, int(size / 5), stroke = 1, + fill=yellow, outline = yellow) + + group.append(rect) + group.append(tri) + group.append(circ) + group.append(rnd) + rect.fill = None + tri.fill = None + circ.fill = None + rnd.fill = None + + time.sleep(2) + + rect.fill = red + tri.fill = green + circ.fill = blue + rnd.fill = yellow + time.sleep(2) + clean_up(group) + del rect + del tri + del circ + del rnd + gc.collect() + +def sine_chart(): + gc.collect() + cx = int(display.width / 2) + cy = int(display.height / 2) + minor = min(cx, cy) + major = max(cx, cy) + + group.append(Line(cx, 0, cx, display.height, blue)) # v + group.append(Line(0, cy, display.width, cy, blue)) # h + + for i in range(10): + _n = simpleio.map_range(i, 0, 10, 0, major - 1) + n = int(_n) + group.append(Line(cx - n, cy - 5, cx - n, (cy - 5) + 11, blue)) # v + group.append(Line(cx + n, cy - 5, cx + n, (cy - 5) + 11, blue)) # v + group.append(Line(cx - 5, cy - n, (cx - 5) + 11, cy - n, blue)) # h + group.append(Line(cx - 5, cy + n, (cx - 5) + 11, cy + n, blue)) # h + + for x in range(display.width): + y = cy - int(math.sin((x - cx) * 0.05) * float(minor * 0.5)) + bitmap[x, y] = 1 + group.append(tile_grid) + time.sleep(2) + clean_up(group) + +def widget0(): + gc.collect() + data = [31, 42, 36, 58, 67, 88] + num_points = len(data) + + text_area = label.Label(terminalio.FONT, text="Widget Sales", color=white) + text_area.anchor_point = (0.5, 0.0) + text_area.anchored_position = (display.width / 2, 3) + group.append(text_area) + for i in range(11): + _x = simpleio.map_range(i, 0, 10, 0, display.width - 1) + x = int(_x) + group.append(Line(x, 20, x, display.height, blue)) + _y = simpleio.map_range(i, 0, 10, 20, display.height - 1) + y = int(_y) + group.append(Line(0, y, display.width, y, blue)) + prev_x = 0 + _prev_y = simpleio.map_range(data[0], 0, 100, display.height - 1, 20) + prev_y = int(_prev_y) + for i in range(1, num_points): + _new_x = simpleio.map_range(i, 0, num_points - 1, 0, display.width - 1) + new_x = int(_new_x) + _new_y = simpleio.map_range(data[i], 0, 100, display.height - 1, 20) + new_y = int(_new_y) + group.append(Line(prev_x, prev_y, new_x, new_y, aqua)) + prev_x = new_x + prev_y = new_y + + for i in range(num_points): + _x = simpleio.map_range(i, 0, num_points - 1, 0, display.width - 1) + x = int(_x) + _y = simpleio.map_range(data[i], 0, 100, display.height - 1, 20) + y = int(_y) + group.append(Circle(x, y, 5, fill=None, stroke = 2, outline = white)) + + time.sleep(2) + clean_up(group) + +def widget1(): + gc.collect() + data = [31, 42, 36, 58, 67, 88] + num_points = len(data) + bar_width = int(display.width / num_points) - 4 + x_mapped_w = display.width + 2 + h_mapped_h = display.height + 20 + + text_area = label.Label(terminalio.FONT, text="Widget Sales", color=white) + text_area.anchor_point = (0.5, 0.0) + text_area.anchored_position = (display.width / 2, 3) + group.append(text_area) + for i in range(11): + _y = simpleio.map_range(i, 0, 10, 20, display.height - 1) + y = int(_y) + group.append(Line(0, y, display.width, y, blue)) + for i in range(num_points): + _x = simpleio.map_range(i, 0, num_points, 0, x_mapped_w) + x = int(_x) + _height = simpleio.map_range(data[i], 0, 100, h_mapped_h, 0) + height = int(_height) + group.append(vectorio.Rectangle(pixel_shader=palette, width=bar_width, + height=display.height + 1, x=x, y=height, color_index = 2)) + + time.sleep(2) + clean_up(group) + +def text_align(): + gc.collect() + TEXT = "hi!" + + text_area_top_left = label.Label(terminalio.FONT, text=TEXT, color=red) + text_area_top_left.anchor_point = (0.0, 0.0) + text_area_top_left.anchored_position = (0, 0) + + text_area_top_middle = label.Label(terminalio.FONT, text=TEXT, color=orange) + text_area_top_middle.anchor_point = (0.5, 0.0) + text_area_top_middle.anchored_position = (display.width / 2, 0) + + text_area_top_right = label.Label(terminalio.FONT, text=TEXT, color=yellow) + text_area_top_right.anchor_point = (1.0, 0.0) + text_area_top_right.anchored_position = (display.width, 0) + + text_area_middle_left = label.Label(terminalio.FONT, text=TEXT, color=green) + text_area_middle_left.anchor_point = (0.0, 0.5) + text_area_middle_left.anchored_position = (0, display.height / 2) + + text_area_middle_middle = label.Label(terminalio.FONT, text=TEXT, color=aqua) + text_area_middle_middle.anchor_point = (0.5, 0.5) + text_area_middle_middle.anchored_position = (display.width / 2, display.height / 2) + + text_area_middle_right = label.Label(terminalio.FONT, text=TEXT, color=blue) + text_area_middle_right.anchor_point = (1.0, 0.5) + text_area_middle_right.anchored_position = (display.width, display.height / 2) + + text_area_bottom_left = label.Label(terminalio.FONT, text=TEXT, color=purple) + text_area_bottom_left.anchor_point = (0.0, 1.0) + text_area_bottom_left.anchored_position = (0, display.height) + + text_area_bottom_middle = label.Label(terminalio.FONT, text=TEXT, color=pink) + text_area_bottom_middle.anchor_point = (0.5, 1.0) + text_area_bottom_middle.anchored_position = (display.width / 2, display.height) + + text_area_bottom_right = label.Label(terminalio.FONT, text=TEXT, color=white) + text_area_bottom_right.anchor_point = (1.0, 1.0) + text_area_bottom_right.anchored_position = (display.width, display.height) + + group.append(text_area_top_middle) + group.append(text_area_top_left) + group.append(text_area_top_right) + group.append(text_area_middle_middle) + group.append(text_area_middle_left) + group.append(text_area_middle_right) + group.append(text_area_bottom_middle) + group.append(text_area_bottom_left) + group.append(text_area_bottom_right) + + time.sleep(2) + clean_up(group) + +def custom_font(): + gc.collect() + my_font = bitmap_font.load_font("/Helvetica-Bold-16.pcf") + text_sample = "The quick brown fox jumps over the lazy dog." + text_sample = "\n".join(wrap_text_to_lines(text_sample, 15)) + text_area = label.Label(my_font, text="Custom Font", color=white) + text_area.anchor_point = (0.0, 0.0) + text_area.anchored_position = (0, 0) + + sample_text = label.Label(my_font, text=text_sample) + sample_text.anchor_point = (0.5, 0.5) + sample_text.anchored_position = (display.width / 2, display.height / 2) + + group.append(text_area) + group.append(sample_text) + + time.sleep(2) + clean_up(group) + + del my_font + gc.collect() + +def bitmap_example(): + gc.collect() + blinka_bitmap = displayio.OnDiskBitmap("/adabot.bmp") + blinka_grid = displayio.TileGrid(blinka_bitmap, pixel_shader=blinka_bitmap.pixel_shader) + gc.collect() + group.append(blinka_grid) + + time.sleep(2) + clean_up(group) + + del blinka_grid + del blinka_bitmap + gc.collect() + +def sensor_values(): + gc.collect() + text_x = "X: %d" % randint(-25, 25) + text_y = "Y: %d" % randint(-25, 25) + text_z = "Z: %d" % randint(-25, 25) + x_text = label.Label(terminalio.FONT, text=text_x, color=red) + x_text.anchor_point = (0.0, 0.0) + x_text.anchored_position = (2, 0) + y_text = label.Label(terminalio.FONT, text=text_y, color=green) + y_text.anchor_point = (0.0, 0.0) + y_text.anchored_position = (2, 10) + z_text = label.Label(terminalio.FONT, text=text_z, color=blue) + z_text.anchor_point = (0.0, 0.0) + z_text.anchored_position = (2, 20) + group.append(x_text) + group.append(y_text) + group.append(z_text) + + for i in range(40): + if i == 10: + group.scale = 2 + elif i == 20: + group.scale = 3 + elif i == 30: + group.scale = 4 + x_text.text = "X: %d" % randint(-50, 50) + y_text.text = "Y: %d" % randint(-50, 50) + z_text.text = "Z: %d" % randint(-50, 50) + time.sleep(0.1) + time.sleep(0.1) + clean_up(group) + group.scale = 1 + +display.root_group = group + +while True: + show_shapes() + sine_chart() + widget0() + widget1() + text_align() + custom_font() + bitmap_example() + sensor_values() diff --git a/Newxie_TFT_Examples/Newxie_Python_Multi_Pi/newxie_clock.py b/Newxie_TFT_Examples/Newxie_Python_Multi_Pi/newxie_clock.py new file mode 100644 index 000000000..e46829354 --- /dev/null +++ b/Newxie_TFT_Examples/Newxie_Python_Multi_Pi/newxie_clock.py @@ -0,0 +1,80 @@ +# SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +from threading import Thread +from PIL import Image, ImageDraw, ImageFont +import digitalio +import board +import busio +from adafruit_rgb_display import st7789 + +BAUDRATE = 10000000 +WIDTH = 135 +HEIGHT = 240 + +cs_pin0 = digitalio.DigitalInOut(board.D23) +dc_pin0 = digitalio.DigitalInOut(board.D25) + +cs_pin1 = digitalio.DigitalInOut(board.CE1) +dc_pin1 = digitalio.DigitalInOut(board.D24) + +cs_pin2 = digitalio.DigitalInOut(board.D16) +dc_pin2 = digitalio.DigitalInOut(board.D26) + +cs_pin3 = digitalio.DigitalInOut(board.D17) +dc_pin3 = digitalio.DigitalInOut(board.D27) + +spi = board.SPI() +spi1 = busio.SPI(clock=board.D21, MOSI=board.D20) + +disp0 = st7789.ST7789(spi, rotation=180, width=WIDTH, height=HEIGHT, + x_offset=53, y_offset=40, cs=cs_pin0, dc=dc_pin0, baudrate=BAUDRATE) +disp1 = st7789.ST7789(spi, rotation=180, width=WIDTH, height=HEIGHT, + x_offset=53, y_offset=40, cs=cs_pin1, dc=dc_pin1, baudrate=BAUDRATE) +disp2 = st7789.ST7789(spi1, rotation=180, width=WIDTH, height=HEIGHT, + x_offset=53, y_offset=40, cs=cs_pin2, dc=dc_pin2, baudrate=BAUDRATE) +disp3 = st7789.ST7789(spi1, rotation=180, width=WIDTH, height=HEIGHT, + x_offset=53, y_offset=40, cs=cs_pin3, dc=dc_pin3, baudrate=BAUDRATE) + +def update_digit_display(disp, get_digit_func): + font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 80) + while True: + digit = get_digit_func() + image = Image.new("RGB", (WIDTH, HEIGHT), "black") + draw = ImageDraw.Draw(image) + + text = str(digit) + text_width, text_height = draw.textsize(text, font=font) + text_x = (WIDTH - text_width) // 2 + text_y = (HEIGHT - text_height) // 2 + draw.text((text_x, text_y), text, font=font, fill="white") + + disp.image(image) + time.sleep(1) + +def get_hour_tens(): + current_time = time.localtime() + hour = current_time.tm_hour % 12 or 12 + return hour // 10 + +def get_hour_ones(): + current_time = time.localtime() + hour = current_time.tm_hour % 12 or 12 + return hour % 10 + +def get_minute_tens(): + current_time = time.localtime() + minute = current_time.tm_min + return minute // 10 + +def get_minute_ones(): + current_time = time.localtime() + minute = current_time.tm_min + return minute % 10 + +Thread(target=update_digit_display, args=(disp0, get_hour_tens)).start() +Thread(target=update_digit_display, args=(disp1, get_hour_ones)).start() +Thread(target=update_digit_display, args=(disp2, get_minute_tens)).start() +Thread(target=update_digit_display, args=(disp3, get_minute_ones)).start() diff --git a/Newxie_TFT_Examples/Newxie_Python_Multi_Pi/newxie_count.py b/Newxie_TFT_Examples/Newxie_Python_Multi_Pi/newxie_count.py new file mode 100644 index 000000000..a521a32ef --- /dev/null +++ b/Newxie_TFT_Examples/Newxie_Python_Multi_Pi/newxie_count.py @@ -0,0 +1,87 @@ +# SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +from threading import Thread, Lock +from PIL import Image, ImageDraw, ImageFont +import digitalio +import board +import busio +from adafruit_rgb_display import st7789 + +BAUDRATE = 25000000 +WIDTH = 135 +HEIGHT = 240 + +cs_pin0 = digitalio.DigitalInOut(board.D23) +dc_pin0 = digitalio.DigitalInOut(board.D25) + +cs_pin1 = digitalio.DigitalInOut(board.CE1) +dc_pin1 = digitalio.DigitalInOut(board.D24) + +cs_pin2 = digitalio.DigitalInOut(board.D16) +dc_pin2 = digitalio.DigitalInOut(board.D26) + +cs_pin3 = digitalio.DigitalInOut(board.D17) +dc_pin3 = digitalio.DigitalInOut(board.D27) + +spi = board.SPI() +spi1 = busio.SPI(clock=board.D21, MOSI=board.D20) + +disp0 = st7789.ST7789(spi, rotation=180, width=WIDTH, height=HEIGHT, + x_offset=53, y_offset=40, cs=cs_pin0, dc=dc_pin0, baudrate=BAUDRATE) +disp1 = st7789.ST7789(spi, rotation=180, width=WIDTH, height=HEIGHT, + x_offset=53, y_offset=40, cs=cs_pin1, dc=dc_pin1, baudrate=BAUDRATE) +disp2 = st7789.ST7789(spi1, rotation=180, width=WIDTH, height=HEIGHT, + x_offset=53, y_offset=40, cs=cs_pin2, dc=dc_pin2, baudrate=BAUDRATE) +disp3 = st7789.ST7789(spi1, rotation=180, width=WIDTH, height=HEIGHT, + x_offset=53, y_offset=40, cs=cs_pin3, dc=dc_pin3, baudrate=BAUDRATE) + +def update_digit_display(disp, get_digit_func): + font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf", 80) + while True: + digit = get_digit_func() + image = Image.new("RGB", (WIDTH, HEIGHT), "black") + draw = ImageDraw.Draw(image) + + text = str(digit) + text_width, text_height = draw.textsize(text, font=font) + text_x = (WIDTH - text_width) // 2 + text_y = (HEIGHT - text_height) // 2 + draw.text((text_x, text_y), text, font=font, fill="white") + + disp.image(image) + time.sleep(0.1) + +counter = 0 +counter_lock = Lock() +# pylint: disable=global-statement +def increment_counter(): + global counter + while True: + with counter_lock: + counter = (counter + 1) % 10000 + time.sleep(0.01) + +def digit_0(): + with counter_lock: + return (counter // 1000) % 10 + +def digit_1(): + with counter_lock: + return (counter // 100) % 10 + +def digit_2(): + with counter_lock: + return (counter // 10) % 10 + +def digit_3(): + with counter_lock: + return counter % 10 + +Thread(target=increment_counter).start() +Thread(target=update_digit_display, args=(disp0, digit_0)).start() +Thread(target=update_digit_display, args=(disp1, digit_1)).start() +Thread(target=update_digit_display, args=(disp2, digit_2)).start() +Thread(target=update_digit_display, args=(disp3, digit_3)).start() diff --git a/Newxie_TFT_Examples/Newxie_Python_Pi/adabot.jpg b/Newxie_TFT_Examples/Newxie_Python_Pi/adabot.jpg new file mode 100644 index 000000000..8b196dc74 Binary files /dev/null and b/Newxie_TFT_Examples/Newxie_Python_Pi/adabot.jpg differ diff --git a/Newxie_TFT_Examples/Newxie_Python_Pi/code.py b/Newxie_TFT_Examples/Newxie_Python_Pi/code.py new file mode 100644 index 000000000..5f2d29ee0 --- /dev/null +++ b/Newxie_TFT_Examples/Newxie_Python_Pi/code.py @@ -0,0 +1,70 @@ +# SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries +# SPDX-FileCopyrightText: Adapted from Melissa LeBlanc-Williams's Pi Demo Code +# +# SPDX-License-Identifier: MIT + +'''Raspberry Pi Graphics example for the Vertical Newxie TFT''' + +import time +import digitalio +import board +from PIL import Image, ImageDraw, ImageFont +from adafruit_rgb_display import st7789 + +BORDER = 20 +FONTSIZE = 24 + +cs_pin = digitalio.DigitalInOut(board.CE0) +dc_pin = digitalio.DigitalInOut(board.D25) +reset_pin = digitalio.DigitalInOut(board.D24) + +BAUDRATE = 24000000 + +spi = board.SPI() + +disp = st7789.ST7789(spi, rotation=180, + width=135, height=240, + x_offset=53, y_offset=40, + cs=cs_pin, + dc=dc_pin, + rst=reset_pin, + baudrate=BAUDRATE, +) + +width = disp.width +height = disp.height + +# -------TEXT AND SHAPES--------- +image1 = Image.new("RGB", (width, height)) +draw1 = ImageDraw.Draw(image1) +draw1.rectangle((0, 0, width, height), fill=(0, 255, 0)) # Green background + +draw1.rectangle( + (BORDER, BORDER, width - BORDER - 1, height - BORDER - 1), fill=(170, 0, 136) +) +font = ImageFont.truetype("/usr/share/fonts/truetype/dejavu/DejaVuSans.ttf", FONTSIZE) +text = "Hello\nWorld!" +(font_width, font_height) = font.getsize(text) +draw1.text( + (30, height // 2 - font_height // 2-12), + text, + font=font, + fill=(255, 255, 0), +) + +# ------ADABOT JPEG DISPLAY---------- +image2 = Image.open("adabot.jpg") +image_ratio = image2.width / image2.height +screen_ratio = width / height +scaled_width = width +scaled_height = image2.height * width // image2.width +image2 = image2.resize((scaled_width, scaled_height), Image.BICUBIC) +x = scaled_width // 2 - width // 2 +y = scaled_height // 2 - height // 2 +image2 = image2.crop((x, y, x + width, y + height)) + +while True: + disp.image(image1) # show text + time.sleep(2) + disp.image(image2) # show adabot + time.sleep(2) diff --git a/PiCowbell_Camera_Demos/JPEG_Capture/code.py b/PiCowbell_Camera_Demos/JPEG_Capture/code.py new file mode 100644 index 000000000..b660016c9 --- /dev/null +++ b/PiCowbell_Camera_Demos/JPEG_Capture/code.py @@ -0,0 +1,98 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Limor Fried for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense +""" +This demo is designed for the Raspberry Pi Pico and Camera PiCowbell + +It take an image when the shutter button is pressed and saves it to +the microSD card. +""" + +import os +import time +import busio +import board +import digitalio +import adafruit_ov5640 +import keypad +import sdcardio +import storage + +print("Initializing SD card") +sd_spi = busio.SPI(clock=board.GP18, MOSI=board.GP19, MISO=board.GP16) +sd_cs = board.GP17 +sdcard = sdcardio.SDCard(sd_spi, sd_cs) +vfs = storage.VfsFat(sdcard) +storage.mount(vfs, "/sd") + +print("construct bus") +i2c = busio.I2C(board.GP5, board.GP4) +print("construct camera") +reset = digitalio.DigitalInOut(board.GP14) +cam = adafruit_ov5640.OV5640( + i2c, + data_pins=( + board.GP6, + board.GP7, + board.GP8, + board.GP9, + board.GP10, + board.GP11, + board.GP12, + board.GP13, + ), + clock=board.GP3, + vsync=board.GP0, + href=board.GP2, + mclk=None, + shutdown=None, + reset=reset, + size=adafruit_ov5640.OV5640_SIZE_VGA, +) +print("print chip id") +print(cam.chip_id) + +keys = keypad.Keys((board.GP22,), value_when_pressed=False, pull=True) + +def exists(filename): + try: + os.stat(filename) + return True + except OSError as _: + return False + + +_image_counter = 0 + + +def open_next_image(): + global _image_counter # pylint: disable=global-statement + while True: + filename = f"/sd/img{_image_counter:04d}.jpg" + _image_counter += 1 + if exists(filename): + continue + print("# writing to", filename) + return open(filename, "wb") + +cam.colorspace = adafruit_ov5640.OV5640_COLOR_JPEG +cam.quality = 3 +b = bytearray(cam.capture_buffer_size) +jpeg = cam.capture(b) + +while True: + shutter = keys.events.get() + # event will be None if nothing has happened. + if shutter: + if shutter.pressed: + time.sleep(0.01) + jpeg = cam.capture(b) + print(f"Captured {len(jpeg)} bytes of jpeg data") + print(f" (had allocated {cam.capture_buffer_size} bytes") + print(f"Resolution {cam.width}x{cam.height}") + try: + with open_next_image() as f: + f.write(jpeg) + print("# Wrote image") + except OSError as e: + print(e) diff --git a/PiCowbell_Camera_Demos/TFT_Viewer/code.py b/PiCowbell_Camera_Demos/TFT_Viewer/code.py new file mode 100644 index 000000000..e8d275459 --- /dev/null +++ b/PiCowbell_Camera_Demos/TFT_Viewer/code.py @@ -0,0 +1,86 @@ +# SPDX-FileCopyrightText: Copyright (c) 2023 Limor Fried for Adafruit Industries +# +# SPDX-License-Identifier: Unlicense +""" +This demo is designed for the Raspberry Pi Pico, Camera PiCowbell, +and ST7789 240x240 SPI TFT display + +It shows the camera image on the LCD +""" + +import time +import busio +import board +import digitalio +import adafruit_ov5640 +import adafruit_st7789 +import displayio + +displayio.release_displays() +spi = busio.SPI(clock=board.GP18, MOSI=board.GP19) +display_bus = displayio.FourWire(spi, command=board.GP21, chip_select=board.GP17, reset=None) +display = adafruit_st7789.ST7789(display_bus, width=240, height=240, rowstart=80, rotation=0) + +print("construct bus") +i2c = busio.I2C(board.GP5, board.GP4) +print("construct camera") +reset = digitalio.DigitalInOut(board.GP14) +cam = adafruit_ov5640.OV5640( + i2c, + data_pins=( + board.GP6, + board.GP7, + board.GP8, + board.GP9, + board.GP10, + board.GP11, + board.GP12, + board.GP13, + ), + clock=board.GP3, + vsync=board.GP0, + href=board.GP2, + mclk=None, + shutdown=None, + reset=reset, + size=adafruit_ov5640.OV5640_SIZE_240X240, +) +print("print chip id") +print(cam.chip_id) + + +cam.colorspace = adafruit_ov5640.OV5640_COLOR_RGB +cam.flip_y = False +cam.flip_x = False +cam.test_pattern = False + +width = display.width +height = display.height + +#cam.test_pattern = OV7670_TEST_PATTERN_COLOR_BAR_FADE +try: + bitmap = displayio.Bitmap(cam.width, cam.height, 65535) +except MemoryError: + print("Oops, 240x240 is a little too big, trying 240x176..") + cam.size = adafruit_ov5640.OV5640_SIZE_QCIF + bitmap = displayio.Bitmap(cam.width, cam.height, 65535) +print(width, height, cam.width, cam.height) +if bitmap is None: + raise SystemExit("Could not allocate a bitmap") + +g = displayio.Group(scale=1, x=(width-cam.width)//2, y=(height-cam.height)//2) +tg = displayio.TileGrid(bitmap, + pixel_shader=displayio.ColorConverter(input_colorspace=displayio.Colorspace.RGB565_SWAPPED) +) +g.append(tg) +display.root_group = g + +t0 = time.monotonic_ns() +display.auto_refresh = False +while True: + cam.capture(bitmap) + bitmap.dirty() + display.refresh(minimum_frames_per_second=0) + t1 = time.monotonic_ns() + print("fps", 1e9 / (t1 - t0)) + t0 = t1 diff --git a/Pi_Bluesky_Scroller/.data/.gitkeep b/Pi_Bluesky_Scroller/.data/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Pi_Bluesky_Scroller/Pi_Bluesky_Scroller.zip b/Pi_Bluesky_Scroller/Pi_Bluesky_Scroller.zip new file mode 100644 index 000000000..73c3c5230 Binary files /dev/null and b/Pi_Bluesky_Scroller/Pi_Bluesky_Scroller.zip differ diff --git a/Pi_Bluesky_Scroller/code.py b/Pi_Bluesky_Scroller/code.py new file mode 100644 index 000000000..d2e99d964 --- /dev/null +++ b/Pi_Bluesky_Scroller/code.py @@ -0,0 +1,198 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +Bluesky_RPi_TFT_Scroller code.py +Infinitely scroll Bluesky posts on a 320x240 pixel TFT +""" +import json +import os +import sys + +import requests +import webview + +FEEDLINK_RETROCOMPUTING = ( + "https://bsky.app/profile/did:plc:tbo4hkau3p2itkar2vsnb3gp/feed/aaabo5oe7bzok" +) + +# Un-comment a single key inside of FEED_ARGS and set it's value to the feed, list or search +# that you want to scroll. +FETCH_ARGS = { + # "feed_share_link": FEEDLINK_RETROCOMPUTING, + # "feed_share_link": "https://bsky.app/profile/did:plc:463touruejpokvutnn5ikxb5/lists/3lbfdtahfzt2a", # pylint: disable=line-too-long + # "search_args": {"q": "Adafruit", "sort": "latest"} + "search_args": {"q": "#circuitpython", "sort": "latest"} +} + + +def at_feed_uri_from_share_link(share_link): + """ + Converts a share link into an AT URI for that resource. + + :param share_link: The share link to convert. + :return str: The AT URI pointing at the resource. + """ + at_feed_uri = share_link.replace("https://bsky.app/profile/", "at://") + if "/feed/" in share_link: + at_feed_uri = at_feed_uri.replace("/feed/", "/app.bsky.feed.generator/") + if "/lists/" in share_link: + at_feed_uri = at_feed_uri.replace("/lists/", "/app.bsky.graph.list/") + return at_feed_uri + + +def fetch_data(feed_share_link=None, search_args=None): + """ + Fetch posts from Bluesky API and write them into the local cached + data files. After posts are written locally iterates over them + and downloads the relevant photos from them. + + Must pass either feed_share_link or search_args. + + :param feed_share_link: The link copied from Bluesky front end to share the feed or list. + :param search_args: A dictionary containing at minimum a ``q`` key with string value of + the hashtag or term to search for. See bsky API docs for other supported keys. + :return: None + """ + # pylint: disable=too-many-statements,too-many-branches + if feed_share_link is None and search_args is None: + # If both inputs are None, just use retrocomputing feed. + feed_share_link = FEEDLINK_RETROCOMPUTING + + # if a share link input was provided + if feed_share_link is not None: + FEED_AT = at_feed_uri_from_share_link(feed_share_link) + # print(FEED_AT) + + # if it's a feed + if "/app.bsky.feed.generator/" in FEED_AT: + URL = (f"https://public.api.bsky.app/xrpc/app.bsky.feed.getFeed?" + f"feed={FEED_AT}&limit=30") + headers = {"Accept-Language": "en"} + resp = requests.get(URL, headers=headers) + + # if it's a list + elif "/app.bsky.graph.list/" in FEED_AT: + URL = (f"https://public.api.bsky.app/xrpc/app.bsky.feed.getListFeed?" + f"list={FEED_AT}&limit=30") + headers = {"Accept-Language": "en"} + resp = requests.get(URL, headers=headers) + + # raise error if it's an unknown type + else: + raise ValueError( + "Only 'app.bsky.feed.generator' and 'app.bsky.graph.list' URIs are supported." + ) + + # if a search input was provided + if search_args is not None: + URL = "https://public.api.bsky.app/xrpc/app.bsky.feed.searchPosts" + headers = {"Accept-Language": "en"} + resp = requests.get(URL, headers=headers, params=search_args) + + with open(".data/raw_data.json", "wb") as f: + # write raw response to cache + f.write(resp.content) + + # Process the post data into a smaller subset + # containing just the bits we need for showing + # on the TFT. + resp_json = json.loads(resp.text) + processed_posts = {"posts": []} + fetched_posts = None + if "feed" in resp_json.keys(): + fetched_posts = resp_json["feed"] + elif "posts" in resp_json.keys(): + fetched_posts = resp_json["posts"] + + for post in fetched_posts: + cur_post = {} + if "post" in post.keys(): + post = post["post"] + cur_post["author"] = post["author"]["handle"] + cur_post["text"] = post["record"]["text"] + + # image handling + if "embed" in post.keys(): + cid = post["cid"] + if "images" in post["embed"].keys(): + cur_post["image_url"] = post["embed"]["images"][0]["thumb"] + elif "thumbnail" in post["embed"].keys(): + cur_post["image_url"] = post["embed"]["thumbnail"] + elif ( + "external" in post["embed"].keys() + and "thumb" in post["embed"]["external"].keys() + ): + cur_post["image_url"] = post["embed"]["external"]["thumb"] + + # if we actually have an image to show + if "image_url" in cur_post.keys(): + # check if we already downloaded this image + if f"{cid}.jpg" not in os.listdir("static/imgs/"): + print(f"downloading: {cur_post['image_url']}") + + # download image and write to file + img_resp = requests.get(cur_post["image_url"]) + with open(f"static/imgs/{cid}.jpg", "wb") as f: + f.write(img_resp.content) + + cur_post["image_file"] = f"{cid}.jpg" + processed_posts["posts"].append(cur_post) + + # save the processed data to a file + with open(".data/processed_data.json", "w", encoding="utf-8") as f: + f.write(json.dumps(processed_posts)) + + +def read_cached_data(): + """ + Load the cached processed data file and return + the data from within it. + + :return: The posts data loaded from JSON + """ + with open(".data/processed_data.json", "r") as f: + return json.load(f) + + +class Api: + """ + API object for interaction between python code here + and JS code running inside the page. + """ + + # pylint: disable=no-self-use + def get_posts(self): + """ + Fetch new posts data from Bluesky API, cache and return it. + :return: Processed data containing everything necessary to show + posts on the TFT. + """ + fetch_data(**FETCH_ARGS) + return read_cached_data() + + def check_quit(self): + """ + Allows the python code to correctly handle KeyboardInterrupt + more quickly. + + :return: None + """ + # pylint: disable=unnecessary-pass + pass + + def quit(self): + window.destroy() + sys.exit(0) + + +# create a webview and load the index.html page +window = webview.create_window( + "bsky posts", "static/index.html", js_api=Api(), + #width=320, height=240, + width=640, height=480, + x=0, y=0, #frameless=True, fullscreen=True + +) +webview.start() +# webview.start(debug=True) # use this one to enable chromium dev tools to see console.log() output from the page. diff --git a/Pi_Bluesky_Scroller/install_apt_requirements.sh b/Pi_Bluesky_Scroller/install_apt_requirements.sh new file mode 100755 index 000000000..22a27f28e --- /dev/null +++ b/Pi_Bluesky_Scroller/install_apt_requirements.sh @@ -0,0 +1,3 @@ +sudo apt install fonts-noto-color-emoji +sudo apt install python3-webview +sudo apt install python3-requests diff --git a/Pi_Bluesky_Scroller/static/imgs/.gitkeep b/Pi_Bluesky_Scroller/static/imgs/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/Pi_Bluesky_Scroller/static/index.html b/Pi_Bluesky_Scroller/static/index.html new file mode 100644 index 000000000..bc6c14f32 --- /dev/null +++ b/Pi_Bluesky_Scroller/static/index.html @@ -0,0 +1,61 @@ + + + + + Bluesky Posts + + + + + +
+ +
+ + + + + + + + \ No newline at end of file diff --git a/Pi_Bluesky_Scroller/static/script.js b/Pi_Bluesky_Scroller/static/script.js new file mode 100644 index 000000000..6692428e5 --- /dev/null +++ b/Pi_Bluesky_Scroller/static/script.js @@ -0,0 +1,126 @@ +// SPDX-FileCopyrightText: 2024 Tim Cocks +// +// SPDX-License-Identifier: MIT + +/* bluesky scroller script.js */ + +// DOM Element references +let $template = document.querySelector("#postTemplate"); +let $postWall = document.querySelector("#postWall"); + +// holds how many times we've fetched data. Used for filtering out older posts +let curFetchIndex = 0; + +// list that will hold new post objects that have been fetched +let newPosts; + +// flag to know whether the wall has been initialized +let initializedWall = false; + +// gets callback when pywebview Api object is ready to be used +window.addEventListener('pywebviewready', function () { + + function fetchNewPosts() { + /* Fetch posts, then initialize the wall if it hasn't been yet */ + + pywebview.api.get_posts().then(function (posts) { + console.log("fetching new data") + if (!initializedWall) { + buildPostWall(posts); + + // start the autoscroller + setTimeout(function(){setInterval(autoScroll, 50);}, 2000); + + // set flag true so we know next time + initializedWall = true + + } else { // wall was initialized already + // just update the newPosts list + newPosts = posts; + } + + curFetchIndex += 1; + }); + } + + // call fetch the first time + fetchNewPosts(); + + // set an interval to call fetch every 7 minutes + setInterval(fetchNewPosts, 7 * 60 * 1000); +}) + +function inflatePostTemplate(postObj) { + /* Takes an object represent the post to show and inflates + * DOM elements and populates them with the post data. */ + + let $post = $template.cloneNode(true); + $post.removeAttribute("id"); + console.log($post); + $post.setAttribute("data-fetch-index", curFetchIndex); + $post.querySelector(".postAuthor").innerText = postObj["author"]; + $post.querySelector(".postText").innerText = postObj["text"]; + if(postObj.hasOwnProperty("image_file")){ + //$post.querySelector(".postImg").src = "../../.data/imgs/" + postObj["image_file"]; + $post.querySelector(".postImg").src = "imgs/" + postObj["image_file"]; + }else{ + $post.removeChild($post.querySelector(".postImg")); + } + + $post.classList.remove("hidden"); + return $post; +} + +function buildPostWall(posts) { + /* Takes an object with a list of posts in it, inflates DOM elements + * for each post in the data and adds it to the wall. */ + + for (let i = 0; i < posts["posts"].length; i++) { + let $post = inflatePostTemplate(posts["posts"][i]) + $postWall.appendChild($post); + } +} + +// gets callback any time a scroll event occurs +window.addEventListener('scroll', function () { + // if scroll is past the boundary line + if (window.scrollY > 1000) { + // get the first post element from the top of the wall + let $firstPost = $postWall.firstElementChild + // remove it from the wall + $postWall.removeChild($firstPost); + + // if there are no new posts currently + if (newPosts === undefined || newPosts["posts"].length === 0) { + // add the first post back to the wall at the bottom + $postWall.appendChild($firstPost); + + } else { // there are new posts to start showing + + // inflate the first new post + $newPost = inflatePostTemplate(newPosts["posts"].shift()); + // add it to the post wall + $postWall.appendChild($newPost); + + // if the post we removed from the top is still current + if ($firstPost.getAttribute("data-fetch-index") === curFetchIndex) { + // add it back in at the bottom + $postWall.appendChild($firstPost); + } + } + } +}); + +function autoScroll() { + /* Function to be called frequently to automatically scroll the page. + * Also calls check_quit() to allow python to handle KeyboardInterrupt */ + pywebview.api.check_quit(); + window.scrollBy(0, 2); +} + +document.addEventListener('keydown', function(event){ + /* Quit if the user presses esc key */ + if (event.key === "Escape"){ + pywebview.api.quit(); + } +} ); \ No newline at end of file diff --git a/Pi_Hole_Ad_Blocker/mini_pitft_stats.py b/Pi_Hole_Ad_Blocker/mini_pitft_stats.py index d797e98c3..3d1349458 100755 --- a/Pi_Hole_Ad_Blocker/mini_pitft_stats.py +++ b/Pi_Hole_Ad_Blocker/mini_pitft_stats.py @@ -90,6 +90,8 @@ while True: cmd = "df -h | awk '$NF==\"/\"{printf \"Disk: %d/%d GB %s\", $3,$2,$5}'" Disk = subprocess.check_output(cmd, shell=True).decode("utf-8") cmd = "cat /sys/class/thermal/thermal_zone0/temp | awk \'{printf \"CPU Temp: %.1f C\", $(NF-0) / 1000}\'" # pylint: disable=line-too-long + Temp = subprocess.check_output(cmd, shell=True).decode("utf-8") + # Pi Hole data! try: @@ -105,25 +107,26 @@ while True: y = top if not buttonA.value: # just button A pressed draw.text((x, y), IP, font=font, fill="#FFFF00") - y += font.getsize(IP)[1] + y += font.getbbox(IP)[3] draw.text((x, y), CPU, font=font, fill="#FFFF00") - y += font.getsize(CPU)[1] + y += font.getbbox(CPU)[3] draw.text((x, y), MemUsage, font=font, fill="#00FF00") - y += font.getsize(MemUsage)[1] + y += font.getbbox(MemUsage)[3] draw.text((x, y), Disk, font=font, fill="#0000FF") - y += font.getsize(Disk)[1] - draw.text((x, y), "DNS Queries: {}".format(DNSQUERIES), font=font, fill="#FF00FF") + y += font.getbbox(Disk)[3] + draw.text((x, y), Temp, font=font, fill="#FF00FF") + y += font.getbbox(Temp)[3] else: draw.text((x, y), IP, font=font, fill="#FFFF00") - y += font.getsize(IP)[1] + y += font.getbbox(IP)[3] draw.text((x, y), HOST, font=font, fill="#FFFF00") - y += font.getsize(HOST)[1] + y += font.getbbox(HOST)[3] draw.text((x, y), "Ads Blocked: {}".format(str(ADSBLOCKED)), font=font, fill="#00FF00") - y += font.getsize(str(ADSBLOCKED))[1] + y += font.getbbox(str(ADSBLOCKED))[3] draw.text((x, y), "Clients: {}".format(str(CLIENTS)), font=font, fill="#0000FF") - y += font.getsize(str(CLIENTS))[1] + y += font.getbbox(str(CLIENTS))[3] draw.text((x, y), "DNS Queries: {}".format(str(DNSQUERIES)), font=font, fill="#FF00FF") - y += font.getsize(str(DNSQUERIES))[1] + y += font.getbbox(str(DNSQUERIES))[3] # Display image. disp.image(image, rotation) diff --git a/PicoW_DVI_AIO_Display/.pico_rp2040.test.only b/PicoW_DVI_AIO_Display/.pico_rp2040.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/PicoW_DVI_AIO_Display/PicoW_DVI_AIO_Display.ino b/PicoW_DVI_AIO_Display/PicoW_DVI_AIO_Display.ino new file mode 100644 index 000000000..a66e8c644 --- /dev/null +++ b/PicoW_DVI_AIO_Display/PicoW_DVI_AIO_Display.ino @@ -0,0 +1,193 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/************************** Configuration ***********************************/ + +// edit the config.h tab and enter your Adafruit IO credentials +// and any additional configuration needed for WiFi, cellular, +// or ethernet clients. +#include "config.h" +#include "sprites.h" +#include // Core display & graphics library +#include // A custom font +#include // A custom font + +// put your four feed names here! + +AdafruitIO_Feed *temp = io.feed("temperature-feed"); +AdafruitIO_Feed *humid = io.feed("humidity-feed"); +AdafruitIO_Feed *bat = io.feed("battery-feed"); +AdafruitIO_Feed *aqi = io.feed("aqi-feed"); + +#define IO_LOOP_DELAY 5000 +unsigned long lastUpdate = 0; +float temp_data; +float humid_data; +int bat_data; +int aqi_data; + +struct outline { + int16_t x, y; // Top-left corner +}; + +outline greenOutline = {159, 35}; +outline yellowOutline = {204, 35}; +outline redOutline = {250, 35}; + +DVIGFX8 display(DVI_RES_320x240p60, false, adafruit_dvibell_cfg); + +void setup() { + + // start the serial connection + Serial.begin(115200); + + // wait for serial monitor to open + //while ( !Serial ) delay(10); + + Serial.print("Connecting to Adafruit IO"); + + // start connection to io.adafruit.com + io.connect(); + + // set up a message handler for the count feed. + // the handleMessage function (defined below) + // will be called whenever a message is + // received from adafruit io. + temp->onMessage(tempMessage); + humid->onMessage(humidMessage); + bat->onMessage(batMessage); + aqi->onMessage(aqiMessage); + + // wait for a connection + while(io.status() < AIO_CONNECTED) { + Serial.print("."); + delay(500); + } + // we are connected + Serial.println(); + Serial.println(io.statusText()); + + // Because Adafruit IO doesn't support the MQTT retain flag, we can use the + // get() function to ask IO to resend the last value for this feed to just + // this MQTT client after the io client is connected. + temp->get(); + humid->get(); + bat->get(); + aqi->get(); + + Serial.println("starting picodvi.."); + if (!display.begin()) { // Blink LED if insufficient RAM + pinMode(LED_BUILTIN, OUTPUT); + for (;;) digitalWrite(LED_BUILTIN, (millis() / 500) & 1); + } + Serial.println("picodvi good to go"); + + // Set up color palette + display.setColor(0, 0x0000); // black + display.setColor(1, 0x057D); // blue + display.setColor(2, 0xB77F); // light blue + display.setColor(3, 0xE8E4); // red + display.setColor(4, 0x3DA9); // green + display.setColor(5, 0xFF80); // yellow + display.setColor(6, 0xFFFF); // white + +} + +void loop() { + // io.run(); is required for all sketches. + // it should always be present at the top of your loop + // function. it keeps the client connected to + // io.adafruit.com, and processes any incoming data. + io.run(); + + if (millis() > (lastUpdate + IO_LOOP_DELAY)) { + display.fillScreen(0); + display.drawBitmap(38, 35, airBitmap, airWidth, airHeight, 2); + display.drawBitmap(47, 132, tempBitmap, tempWidth, tempHeight, 3); + display.drawBitmap(145, 132, waterBitmap, waterWidth, waterHeight, 1); + display.drawBitmap(248, 132, batBitmap, batWidth, batHeight, 6); + drawBatterySquare(bat_data); + displayAQI(aqi_data); + display.setFont(&FreeSansBold18pt7b); + display.setTextColor(6); + display.setCursor(38 + airWidth + 15, 38 + airHeight - 10); + display.println(aqi_data); + display.setFont(&FreeSans9pt7b); + display.setCursor(47 - 9, 130 + tempHeight + 25); + display.print(temp_data, 2); + display.println(" F"); + display.setCursor(145 - 9, 130 + tempHeight + 25); + display.print(humid_data, 2); + display.println("%"); + display.setCursor(248 - 5, 130 + tempHeight + 25); + display.print(bat_data); + display.println("%"); + // store the current time + lastUpdate = millis(); + } + +} + +void humidMessage(AdafruitIO_Data *data) { + //Serial.print("received <- "); + Serial.println(data->value()); + String h = data->value(); + humid_data = h.toFloat(); +} + +void tempMessage(AdafruitIO_Data *data) { + //Serial.print("received <- "); + Serial.println(data->value()); + String d = data->value(); + temp_data = d.toFloat(); +} + +void batMessage(AdafruitIO_Data *data) { + //Serial.print("received <- "); + Serial.println(data->value()); + String b = data->value(); + bat_data = b.toInt(); +} + +void aqiMessage(AdafruitIO_Data *data) { + //Serial.print("received <- "); + Serial.println(data->value()); + String a = data->value(); + aqi_data = a.toInt(); +} + +void displayAQI(int data) { + display.fillRoundRect(164, 40, 30, 30, 4, 4); + display.fillRoundRect(209, 40, 30, 30, 4, 5); + display.fillRoundRect(255, 40, 30, 30, 4, 3); + if (data <= 12) { // Good + display.drawRoundRect(greenOutline.x, greenOutline.y, 40, 40, 4, 6); + } else if (data <= 35) { // Bad + display.drawRoundRect(yellowOutline.x, yellowOutline.y, 40, 40, 4, 6); + } else { // Dangerous + display.drawRoundRect(redOutline.x, redOutline.y, 40, 40, 4, 6); + } +} + +void drawBatterySquare(int data) { + int BASE_SQUARE_X = 252; // Base X position + int BASE_SQUARE_Y = 140; // Base Y position + int SQUARE_WIDTH = 21; // Width is constant + int MAX_SQUARE_HEIGHT = 35; // Maximum height for 100% charge + // Map battery percentage to square height + int height = map(data, 0, 100, 0, MAX_SQUARE_HEIGHT); + // Choose color based on battery percentage + uint16_t color; + if (data >= 70) { + color = 4; + } else if (data >= 40) { + color = 5; + } else { + color = 3; + } + // Calculate Y position based on height to draw from bottom up + int yPos = BASE_SQUARE_Y + (MAX_SQUARE_HEIGHT - height); + // Draw the battery square + display.fillRect(BASE_SQUARE_X, yPos, SQUARE_WIDTH, height, color); +} diff --git a/PicoW_DVI_AIO_Display/config.h b/PicoW_DVI_AIO_Display/config.h new file mode 100644 index 000000000..a8ad8a069 --- /dev/null +++ b/PicoW_DVI_AIO_Display/config.h @@ -0,0 +1,76 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/************************ Adafruit IO Config *******************************/ + +// visit io.adafruit.com if you need to create an account, +// or if you need your Adafruit IO key. +#define IO_USERNAME "YOUR-AIO-USERNAME" +#define IO_KEY "YOUR-AIO-KEY" + +/******************************* WIFI **************************************/ + +// the AdafruitIO_WiFi client will work with the following boards: +// - HUZZAH ESP8266 Breakout -> https://www.adafruit.com/products/2471 +// - Feather HUZZAH ESP8266 -> https://www.adafruit.com/products/2821 +// - Feather HUZZAH ESP32 -> https://www.adafruit.com/product/3405 +// - Feather M0 WiFi -> https://www.adafruit.com/products/3010 +// - Feather WICED -> https://www.adafruit.com/products/3056 +// - Adafruit PyPortal -> https://www.adafruit.com/product/4116 +// - Adafruit Metro M4 Express AirLift Lite -> +// https://www.adafruit.com/product/4000 +// - Adafruit AirLift Breakout -> https://www.adafruit.com/product/4201 +// - Adafruit AirLift Shield -> https://www.adafruit.com/product/4285 +// - Adafruit AirLift FeatherWing -> https://www.adafruit.com/product/4264 + +#define WIFI_SSID "YOUR-WIFI-SSID" +#define WIFI_PASS "YOUR-WIFI-SSID-PASSWORD" + +// uncomment the following line if you are using airlift +// #define USE_AIRLIFT + +// uncomment the following line if you are using winc1500 +// #define USE_WINC1500 + +// uncomment the following line if you are using mrk1010 or nano 33 iot +//#define ARDUINO_SAMD_MKR1010 + +// comment out the following lines if you are using fona or ethernet +#include "AdafruitIO_WiFi.h" + +#if defined(USE_AIRLIFT) || defined(ADAFRUIT_METRO_M4_AIRLIFT_LITE) || \ + defined(ADAFRUIT_PYPORTAL) +// Configure the pins used for the ESP32 connection +#if !defined(SPIWIFI_SS) // if the wifi definition isnt in the board variant +// Don't change the names of these #define's! they match the variant ones +#define SPIWIFI SPI +#define SPIWIFI_SS 10 // Chip select pin +#define NINA_ACK 9 // a.k.a BUSY or READY pin +#define NINA_RESETN 6 // Reset pin +#define NINA_GPIO0 -1 // Not connected +#endif +AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS, SPIWIFI_SS, + NINA_ACK, NINA_RESETN, NINA_GPIO0, &SPIWIFI); +#else +AdafruitIO_WiFi io(IO_USERNAME, IO_KEY, WIFI_SSID, WIFI_PASS); +#endif +/******************************* FONA **************************************/ + +// the AdafruitIO_FONA client will work with the following boards: +// - Feather 32u4 FONA -> https://www.adafruit.com/product/3027 + +// uncomment the following two lines for 32u4 FONA, +// and comment out the AdafruitIO_WiFi client in the WIFI section +// #include "AdafruitIO_FONA.h" +// AdafruitIO_FONA io(IO_USERNAME, IO_KEY); + +/**************************** ETHERNET ************************************/ + +// the AdafruitIO_Ethernet client will work with the following boards: +// - Ethernet FeatherWing -> https://www.adafruit.com/products/3201 + +// uncomment the following two lines for ethernet, +// and comment out the AdafruitIO_WiFi client in the WIFI section +// #include "AdafruitIO_Ethernet.h" +// AdafruitIO_Ethernet io(IO_USERNAME, IO_KEY); diff --git a/PicoW_DVI_AIO_Display/sprites.h b/PicoW_DVI_AIO_Display/sprites.h new file mode 100644 index 000000000..2ed8181fe --- /dev/null +++ b/PicoW_DVI_AIO_Display/sprites.h @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#define airWidth 31 +#define airHeight 38 +const uint8_t PROGMEM airBitmap[] = { + 0x00, 0x00, 0x01, 0x80, 0x00, 0x38, 0x03, 0xC0, 0x00, 0x10, 0x07, 0xC0, 0x07, + 0x00, 0xC7, 0xC0, 0x0F, 0x81, 0xE3, 0xC0, 0x0F, 0x81, 0xE0, 0x00, 0x0F, 0x81, + 0xE0, 0x00, 0x0F, 0x80, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x1C, 0x0F, + 0x00, 0x00, 0x1E, 0x1F, 0x80, 0x00, 0x3E, 0x3F, 0xC0, 0x00, 0x1E, 0x3F, 0xC0, + 0x00, 0x1C, 0x3F, 0xC0, 0x18, 0x00, 0x3F, 0xC0, 0x38, 0x00, 0x1F, 0xC0, 0x10, + 0x00, 0x0F, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x3F, + 0xE0, 0x38, 0x00, 0xFF, 0xF8, 0x38, 0x01, 0xFF, 0xFC, 0x00, 0x03, 0xFF, 0xFC, + 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFF, 0xE0, + 0x1F, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x7F, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, + 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, + 0xF8, 0x1F, 0xFF, 0xFF, 0xF0, 0x07, 0xFF, 0xFF, 0xC0 + }; + +#define batWidth 29 +#define batHeight 46 +const uint8_t PROGMEM batBitmap[] = { + 0x00, 0xFF, 0xF8, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x01, + 0xFF, 0xFC, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x0F, 0xFF, 0xFF, 0x80, 0x3F, 0xFF, + 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0xF0, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, + 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, + 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, + 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, + 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, + 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, + 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, + 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, + 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, 0x00, 0x00, 0x70, 0x70, + 0x00, 0x00, 0x70, 0x7F, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, + 0xFF, 0xC0 + }; + +#define tempWidth 29 +#define tempHeight 47 +const uint8_t PROGMEM tempBitmap[] = { + 0x00, 0x0F, 0x80, 0x00, 0x00, 0x7F, 0xF0, 0x00, 0x00, 0xFF, 0xF8, 0x00, 0x01, + 0xFF, 0xFC, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x03, 0xFF, 0xFE, 0x00, 0x07, 0xFF, + 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, + 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, + 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, + 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, + 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, + 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, 0x07, 0xFF, 0xFF, 0x00, + 0x0F, 0xFF, 0xFF, 0x80, 0x1F, 0xFF, 0xFF, 0xC0, 0x3F, 0xFF, 0xFF, 0xE0, 0x3F, + 0xFF, 0xFF, 0xE0, 0x7F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, + 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, 0xF8, 0xFF, 0xFF, 0xFF, + 0xF8, 0x7F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, 0xF0, 0x7F, 0xFF, 0xFF, 0xF0, + 0x3F, 0xFF, 0xFF, 0xE0, 0x3F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xC0, 0x0F, + 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFF, 0x00, 0x01, 0xFF, 0xFC, 0x00, 0x00, 0x7F, + 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + +#define waterWidth 31 +#define waterHeight 49 +const uint8_t PROGMEM waterBitmap[] = { + 0x00, 0x01, 0x00, 0x00, 0x00, 0x07, 0xC0, 0x00, 0x00, 0x0F, 0xC0, 0x00, 0x00, + 0x0F, 0xE0, 0x00, 0x00, 0x1F, 0xE0, 0x00, 0x00, 0x1F, 0xF0, 0x00, 0x00, 0x3F, + 0xF0, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x7F, 0xF8, 0x00, 0x00, 0x7F, 0xFC, + 0x00, 0x00, 0x7F, 0xFC, 0x00, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0xFF, 0xFE, 0x00, + 0x01, 0xFF, 0xFE, 0x00, 0x01, 0xFF, 0xFF, 0x00, 0x03, 0xFF, 0xFF, 0x00, 0x03, + 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFF, 0x80, 0x07, 0xFF, 0xFF, 0xC0, 0x0F, 0xFF, + 0xFF, 0xC0, 0x0F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, 0xE0, 0x1F, 0xFF, 0xFF, + 0xF0, 0x3F, 0xFF, 0xFF, 0xF0, 0x3F, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xF8, + 0x7F, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, 0xFF, + 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, + 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, + 0xFE, 0xFF, 0xFF, 0xFF, 0xFE, 0x7F, 0xFF, 0xFF, 0xFC, 0x7F, 0xFF, 0xFF, 0xFC, + 0x7F, 0xFF, 0xFF, 0xFC, 0x3F, 0xFF, 0xFF, 0xF8, 0x3F, 0xFF, 0xFF, 0xF8, 0x1F, + 0xFF, 0xFF, 0xF0, 0x0F, 0xFF, 0xFF, 0xE0, 0x07, 0xFF, 0xFF, 0xC0, 0x03, 0xFF, + 0xFF, 0x80, 0x00, 0xFF, 0xFE, 0x00, 0x00, 0x3F, 0xF8, 0x00, 0x00, 0x07, 0xC0, + 0x00 + }; diff --git a/PicoW_YBox3/.feather_rp2040.test.only b/PicoW_YBox3/.feather_rp2040.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/PicoW_YBox3/PicoW_YBox3.ino b/PicoW_YBox3/PicoW_YBox3.ino new file mode 100644 index 000000000..49745be84 --- /dev/null +++ b/PicoW_YBox3/PicoW_YBox3.ino @@ -0,0 +1,405 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// YBox3 with Pico W and DVI PiCowbell +// Bouncing ball screensaver written by Phil B. +// Update user config section with your information + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// graphics header files must be included +// in the Arduino IDE project: +#include "graphics.h" +#include "weather_sprites.h" +#include "ybox3.h" + +//---------User Config------------// +#define IR_RECEIVE_PIN 2 +const char* ssid = "your-ssid-here"; +const char* password = "your-ssid-password-here"; +String owm_location = "your-open-weather-maps-location-here"; +String owm_key = "your-open-weather-maps-key-here"; +// timezone as UTC offset and text +int timezone = -4; +const char* tz_text = "EST5EDT"; +//-------------------------------// + +int sprite_w = 45; +int sprite_h = 32; +int yPosition = 260; + +bool fetch = true; + +unsigned long lastUpdate = 0; +unsigned long lastMillis = 0; +unsigned long lastScroll = 0; +int LOOP_DELAY = 30000; +int scrollTime = 30; + +char dayBuffer[10]; +char dateBuffer[20]; +char timeBuffer[10]; + +String weatherEndpoint = "http://api.openweathermap.org/data/2.5/weather?q=" + owm_location + "&appid=" + owm_key; +String clockEndpoint = "http://worldtimeapi.org/api/timezone/Etc/UTC"; +String apiEndpoint = clockEndpoint; +String channelNow = "clock"; + +DVIGFX8 display(DVI_RES_320x240p60, true, adafruit_dvibell_cfg); + +#define YBOTTOM 123 // Ball Y coord at bottom +#define YBOUNCE -3.5 // Upward velocity on ball bounce + +// Ball coordinates are stored floating-point because screen refresh +// is so quick, whole-pixel movements are just too fast! +float ballx = 20.0, bally = YBOTTOM, // Current ball position + ballvx = 0.8, ballvy = YBOUNCE, // Ball velocity + ballframe = 3; // Ball animation frame # +int balloldx = ballx, balloldy = bally; // Prior ball position + +void setup() { + Serial.begin(115200); + while ( !Serial ) delay(10); + + // Connect to WiFi + Serial.println(); + Serial.print("Connecting to "); + Serial.println(ssid); + WiFi.begin(ssid, password); + + while (WiFi.status() != WL_CONNECTED) { + delay(500); + Serial.print("."); + } + + Serial.println(); + Serial.println("WiFi connected"); + + Serial.println("starting picodvi.."); + if (!display.begin()) { // Blink LED if insufficient RAM + pinMode(LED_BUILTIN, OUTPUT); + for (;;) digitalWrite(LED_BUILTIN, (millis() / 500) & 1); + } + Serial.println("picodvi good to go"); + resetPalette(); + + display.swap(true, true); // Duplicate same bg & palette into both buffers + Serial.println("starting ir.."); + IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); + Serial.println("ir good to go"); + + lastMillis = millis(); +} + +void loop() { + if (channelNow == "bounce") { + // bouncing ball screensaver written by Phil B. + balloldx = (int16_t)ballx; // Save prior position + balloldy = (int16_t)bally; + ballx += ballvx; // Update position + bally += ballvy; + ballvy += 0.06; // Update Y velocity + if((ballx <= 15) || (ballx >= display.width() - BALLWIDTH)) + ballvx *= -1; // Left/right bounce + if(bally >= YBOTTOM) { // Hit ground? + bally = YBOTTOM; // Clip and + ballvy = YBOUNCE; // bounce up + } + + // Determine screen area to update. This is the bounds of the ball's + // prior and current positions, so the old ball is fully erased and new + // ball is fully drawn. + int16_t minx, miny, maxx, maxy, width, height; + // Determine bounds of prior and new positions + minx = ballx; + if(balloldx < minx) minx = balloldx; + miny = bally; + if(balloldy < miny) miny = balloldy; + maxx = ballx + BALLWIDTH - 1; + if((balloldx + BALLWIDTH - 1) > maxx) maxx = balloldx + BALLWIDTH - 1; + maxy = bally + BALLHEIGHT - 1; + if((balloldy + BALLHEIGHT - 1) > maxy) maxy = balloldy + BALLHEIGHT - 1; + + width = maxx - minx + 1; + height = maxy - miny + 1; + + // Ball animation frame # is incremented opposite the ball's X velocity + ballframe -= ballvx * 0.5; + if(ballframe < 0) ballframe += 14; // Constrain from 0 to 13 + else if(ballframe >= 14) ballframe -= 14; + + // Set 7 palette entries to white, 7 to red, based on frame number. + // This makes the ball spin. + for(uint8_t i=0; i<14; i++) { + display.setColor(i + 4, ((((int)ballframe + i) % 14) < 7) ? 0xFFFF : 0xF800); + } + + // Only the changed rectangle is drawn into the 'renderbuf' array... + uint8_t c, *destPtr; + int16_t bx = minx - (int)ballx, // X relative to ball bitmap (can be negative) + by = miny - (int)bally, // Y relative to ball bitmap (can be negative) + bgx = minx, // X relative to background bitmap (>= 0) + bgy = miny, // Y relative to background bitmap (>= 0) + x, y, bx1, bgx1; // Loop counters and working vars + uint8_t p; // 'packed' value of 2 ball pixels + int8_t bufIdx = 0; + + uint8_t *buf = display.getBuffer(); // -> back buffer + + for(y=0; y= 0) && (bx1 < BALLWIDTH) && // Is current pixel row/column + (by >= 0) && (by < BALLHEIGHT)) { // inside the ball bitmap area? + // Yes, do ball compositing math... + p = ball[by][bx1 / 2]; // Get packed value (2 pixels) + c = (bx1 & 1) ? (p & 0xF) : (p >> 4); // Unpack high or low nybble + if(c == 0) { // Outside ball - just draw grid + c = background[bgy][bgx1 / 8] & (0x80 >> (bgx1 & 7)) ? 1 : 0; + } else if(c > 1) { // In ball area... + c += 2; // Convert to color index >= 4 + } else { // In shadow area, draw shaded grid... + c = background[bgy][bgx1 / 8] & (0x80 >> (bgx1 & 7)) ? 3 : 2; + } + } else { // Outside ball bitmap, just draw background bitmap... + c = background[bgy][bgx1 / 8] & (0x80 >> (bgx1 & 7)) ? 1 : 0; + } + *destPtr++ = c; // Store pixel color + bx1++; // Increment bitmap position counters (X axis) + bgx1++; + } + by++; // Increment bitmap position counters (Y axis) + bgy++; + } + + display.swap(true, false); // Show & copy current background buffer to next + + } else { + if (millis() > (lastUpdate + LOOP_DELAY) or fetch) { + fetch = false; + if (WiFi.status() == WL_CONNECTED) { + HTTPClient http; + http.begin(apiEndpoint); + int httpResponseCode = http.GET(); + if (httpResponseCode > 0) { + String payload = http.getString(); + Serial.println(payload); + DynamicJsonDocument doc(1024); + DeserializationError error = deserializeJson(doc, payload); + if (!error) { + if (channelNow == "weather") { + String location = doc["name"].as(); + const char* weather = doc["weather"][0]["main"]; + float temperature = doc["main"]["temp"]; + int pressure = doc["main"]["pressure"]; + int humid = doc["main"]["humidity"]; + uint32_t datetime = doc["dt"]; + String icon = doc["weather"][0]["icon"].as(); + String dtBuffer = unixTimeToReadable(datetime); + float converted_temp = (temperature - 273.15) * 9/5 + 32; + display.fillScreen(4); + const uint16_t* bitmap = getIcon(icon); + display.setCursor(100, 38); + display.setFont(&FreeSans9pt7b); + display.setTextColor(8); + display.print(location); + display.println(" Weather"); + display.println(); + display.drawRGBBitmap(0, sprite_h / 2, bitmap, sprite_w, sprite_h); + display.drawRGBBitmap(320 - sprite_w, sprite_h / 2, bitmap, sprite_w, sprite_h); + display.setTextColor(10); + display.println(weather); + display.setTextColor(7); + display.print("Temperature: "); + display.print(converted_temp); + display.println(" F"); + display.setTextColor(5); + display.print("Humidity: "); + display.print(humid); + display.println(" %"); + display.setTextColor(9); + display.print("Barometric Pressure: "); + display.print(pressure); + display.println(" hPa"); + display.println(); + display.setTextColor(1); + display.print("Fetched: "); + display.println(dtBuffer); + } else if (channelNow == "clock") { + String datetime = doc["utc_datetime"].as(); + Serial.println(datetime); + struct tm timeinfo = parseISO8601(datetime, timezone); + strftime(dayBuffer, sizeof(dayBuffer), "%A", &timeinfo); + strftime(dateBuffer, sizeof(dateBuffer), "%B %d, %Y", &timeinfo); + strftime(timeBuffer, sizeof(timeBuffer), "%I:%M %p", &timeinfo); + + } else { + Serial.print("deserializeJson() failed: "); + Serial.println(error.f_str()); + } + } else { + Serial.print("Error code: "); + Serial.println(httpResponseCode); + } + http.end(); + } else { + Serial.println("WiFi Disconnected"); + WiFi.begin(ssid, password); + } + lastUpdate = millis(); + } + } + + if (millis() > (lastScroll + scrollTime)) { + if (channelNow == "clock") { + display.fillRect(0, 160, 320, 240-160, 4); + display.setFont(&FreeSansBold18pt7b); + display.setTextColor(10); + display.setCursor(55, yPosition); + display.println("Today is "); + display.setCursor(55, yPosition + 40); + display.setTextColor(7); + display.println(dayBuffer); + display.setCursor(55, yPosition + 80); + display.setTextColor(9); + display.println(dateBuffer); + display.setCursor(55, yPosition + 120); + display.setTextColor(10); + display.println("The time is "); + display.setTextColor(5); + display.setCursor(55, yPosition + 160); + display.println(timeBuffer); + display.drawRGBBitmap(0, 0, myBitmapybox3_bmp, 320, 162); + + yPosition--; // Move the text up + if (yPosition < 0) { // Reset to below the display after text has scrolled up + yPosition = 260; + } + } + lastScroll = millis(); + display.swap(true, false); + } + } + + if (IrReceiver.decode()) { + if (IrReceiver.decodedIRData.protocol == NEC) { + if (IrReceiver.decodedIRData.command == 0x10) { + Serial.println("pressed 1"); + display.fillScreen(4); + fetch = true; + resetPalette(); + apiEndpoint = clockEndpoint; + yPosition = 260; + channelNow = "clock"; + LOOP_DELAY = 30000; + display.swap(true, true); + } else if (IrReceiver.decodedIRData.command == 0x11) { + Serial.println("pressed 2"); + display.fillScreen(4); + fetch = true; + resetPalette(); + apiEndpoint = weatherEndpoint; + channelNow = "weather"; + LOOP_DELAY = 300000; + display.swap(true, true); + } else if (IrReceiver.decodedIRData.command == 0x12) { + Serial.println("pressed 3"); + channelNow = "bounce"; + // Draw initial framebuffer contents (grid, no shadow): + display.drawBitmap(0, 0, (uint8_t *)background, 320, 240, 1, 0); + } + IrReceiver.resume(); + } else { + IrReceiver.resume(); + } + } +} + +String unixTimeToReadable(uint32_t unixTime) { + setenv("TZ", tz_text, 1); + tzset(); + + struct tm timeinfo; + time_t t = unixTime; + localtime_r(&t, &timeinfo); + + char dBuffer[30]; + strftime(dBuffer, sizeof(dBuffer), "%m/%d/%y", &timeinfo); + + char tBuffer[10]; + strftime(tBuffer, sizeof(tBuffer), "%I:%M %p", &timeinfo); + + // Return seconds followed by the formatted date and time string + return String(dBuffer) + " @ " + String(tBuffer); +} + +struct tm parseISO8601(String d, int tzo) { + struct tm tm; + sscanf(d.c_str(), "%d-%d-%dT%d:%d:%d", + &tm.tm_year, &tm.tm_mon, &tm.tm_mday, + &tm.tm_hour, &tm.tm_min, &tm.tm_sec); + tm.tm_year -= 1900; // Adjust since tm struct expects years since 1900 + tm.tm_mon -= 1; // Adjust since tm struct expects months from 0-11 + tm.tm_isdst = -1; + Serial.println(tm.tm_hour); + Serial.println(tzo); + tm.tm_hour += tzo; // Apply timezone offset directly + Serial.println(tm.tm_hour); + mktime(&tm); // Normalize the tm struct after manual adjustments + return tm; +} + +void resetPalette() { + display.setColor(0, 0xAD75); // #0 = Background color + display.setColor(1, 0xA815); // #1 = Grid color + display.setColor(2, 0x5285); // #2 = Background in shadow + display.setColor(3, 0x600C); // #3 = Grid in shadow + display.setColor(4, 0x0000); // black + display.setColor(5, 0x057D); // blue + display.setColor(6, 0xB77F); // light blue + display.setColor(7, 0xE8E4); // red + display.setColor(8, 0x3DA9); // green + display.setColor(9, 0xFF80); // yellow + display.setColor(10, 0xFFFF); // white + display.setColor(11, 0x0021); + display.setColor(12, 0x0020); + display.setColor(13, 0xeca0); + display.setColor(14, 0xec80); + display.setColor(15, 0x0001); + display.setColor(16, 0xfe43); + display.setColor(17, 0x31eb); + display.setColor(18, 0x320b); + display.setColor(19, 0xad56); + display.setColor(20, 0x1927); + display.setColor(21, 0x4a4a); + display.setColor(22, 0x73ae); + display.setColor(23, 0x4249); + display.setColor(24, 0x424a); + display.setColor(25, 0x4a49); + display.setColor(26, 0xfbe0); + display.setColor(27, 0xfc00); + display.setColor(28, 0xf3e0); + display.setColor(29, 0x1947); + display.setColor(30, 0xf400); + display.setColor(31, 0x0821); + display.setColor(32, 0x0800); + display.setColor(33, 0xf500); + display.setColor(34, 0xfd00); + display.setColor(35, 0xf520); + display.setColor(36, 0xfd20); + display.setColor(37, 0xee43); + display.setColor(38, 0xf643); + display.setColor(39, 0xfe23); + display.setColor(40, 0xee23); +} diff --git a/PicoW_YBox3/graphics.h b/PicoW_YBox3/graphics.h new file mode 100644 index 000000000..dcee26094 --- /dev/null +++ b/PicoW_YBox3/graphics.h @@ -0,0 +1,1379 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT +// Graphics arrays were generated from PNG images using Python and PIL. +// Each is bit-packed into bytes: background is 1bpp, ball is 4bpp. + +const uint8_t background[240][320 / 8] = { + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X07, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFC, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X08, 0X00, 0X08, 0X00, + 0X08, 0X00, 0X08, 0X00, 0X08, 0X00, 0X04, 0X00, 0X04, 0X00, 0X04, 0X00, + 0X04, 0X00, 0X04, 0X00, 0X02, 0X00, 0X02, 0X00, 0X02, 0X00, 0X02, 0X00, + 0X02, 0X00, 0X03, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0X80, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X40, 0X00, 0X20, 0X00, 0X20, 0X00, 0X10, 0X00, + 0X10, 0X00, 0X08, 0X00, 0X08, 0X00, 0X04, 0X00, 0X02, 0X00, 0X02, 0X00, + 0X01, 0X00, 0X01, 0X00, 0X00, 0X80, 0X00, 0X80, 0X00, 0X40, 0X00, 0X40, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X80, 0X00, 0X40, 0X00, + 0X20, 0X00, 0X20, 0X00, 0X10, 0X00, 0X08, 0X00, 0X08, 0X00, 0X04, 0X00, + 0X02, 0X00, 0X02, 0X00, 0X01, 0X00, 0X00, 0X80, 0X00, 0X80, 0X00, 0X40, + 0X00, 0X20, 0X00, 0X30, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XF8, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X02, 0X00, 0X01, 0X00, 0X00, 0X80, 0X00, 0X40, 0X00, + 0X20, 0X00, 0X10, 0X00, 0X08, 0X00, 0X04, 0X00, 0X02, 0X00, 0X01, 0X00, + 0X00, 0X80, 0X00, 0X40, 0X00, 0X20, 0X00, 0X10, 0X00, 0X08, 0X00, 0X06, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0C, 0X00, 0X02, 0X00, 0X01, + 0X00, 0X00, 0X80, 0X00, 0X40, 0X00, 0X10, 0X00, 0X08, 0X00, 0X04, 0X00, + 0X02, 0X00, 0X01, 0X00, 0X00, 0X40, 0X00, 0X20, 0X00, 0X10, 0X00, 0X08, + 0X00, 0X06, 0X00, 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X10, + 0X00, 0X04, 0X00, 0X02, 0X00, 0X01, 0X00, 0X00, 0X40, 0X00, 0X20, 0X00, + 0X08, 0X00, 0X04, 0X00, 0X02, 0X00, 0X00, 0X80, 0X00, 0X40, 0X00, 0X10, + 0X00, 0X08, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X80, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X3F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XE0, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X40, 0X00, 0X10, 0X00, 0X08, + 0X00, 0X02, 0X00, 0X00, 0X80, 0X00, 0X20, 0X00, 0X10, 0X00, 0X04, 0X00, + 0X01, 0X00, 0X00, 0X80, 0X00, 0X20, 0X00, 0X08, 0X00, 0X02, 0X00, 0X01, + 0X00, 0X00, 0X40, 0X00, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X80, + 0X00, 0X20, 0X00, 0X10, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X40, 0X00, + 0X10, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X40, 0X00, 0X10, 0X00, 0X04, + 0X00, 0X01, 0X00, 0X00, 0X80, 0X00, 0X20, 0X00, 0X08, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X03, 0X00, 0X00, 0XC0, 0X00, 0X10, 0X00, 0X04, 0X00, 0X01, + 0X00, 0X00, 0X40, 0X00, 0X10, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X40, + 0X00, 0X10, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X60, 0X00, 0X18, 0X00, + 0X06, 0X00, 0X00, 0X00, 0X00, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X20, + 0X00, 0X08, 0X00, 0X02, 0X00, 0X00, 0X80, 0X00, 0X10, 0X00, 0X04, 0X00, + 0X01, 0X00, 0X00, 0X20, 0X00, 0X08, 0X00, 0X02, 0X00, 0X00, 0X80, 0X00, + 0X10, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X00, 0X00, 0X00, 0X08, 0X00, + 0X02, 0X00, 0X00, 0X40, 0X00, 0X10, 0X00, 0X02, 0X00, 0X00, 0X80, 0X00, + 0X10, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X20, 0X00, 0X08, 0X00, 0X01, + 0X00, 0X00, 0X40, 0X00, 0X08, 0X00, 0X02, 0X00, 0X00, 0XC0, 0X00, 0X00, + 0X00, 0X00, 0X1F, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XE0, 0X00, 0X00, 0X00, 0X00, 0X60, 0X00, 0X08, 0X00, 0X01, 0X00, + 0X00, 0X20, 0X00, 0X04, 0X00, 0X01, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, + 0X00, 0X80, 0X00, 0X10, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X10, 0X00, + 0X02, 0X00, 0X00, 0XC0, 0X00, 0X10, 0X00, 0X00, 0X00, 0X00, 0X80, 0X00, + 0X10, 0X00, 0X02, 0X00, 0X00, 0X40, 0X00, 0X08, 0X00, 0X01, 0X00, 0X00, + 0X20, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X10, 0X00, 0X02, 0X00, 0X00, + 0X40, 0X00, 0X08, 0X00, 0X01, 0X00, 0X00, 0X20, 0X00, 0X0C, 0X00, 0X00, + 0X00, 0X01, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X08, + 0X00, 0X01, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X10, + 0X00, 0X02, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X10, + 0X00, 0X02, 0X00, 0X00, 0X00, 0X02, 0X00, 0X00, 0X40, 0X00, 0X08, 0X00, + 0X00, 0X80, 0X00, 0X10, 0X00, 0X02, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, + 0X00, 0X80, 0X00, 0X08, 0X00, 0X01, 0X00, 0X00, 0X20, 0X00, 0X02, 0X00, + 0X00, 0X40, 0X00, 0X08, 0X00, 0X01, 0X80, 0X00, 0X00, 0X04, 0X00, 0X00, + 0X80, 0X00, 0X08, 0X00, 0X01, 0X00, 0X00, 0X10, 0X00, 0X02, 0X00, 0X00, + 0X20, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X08, 0X00, 0X01, 0X00, 0X00, + 0X10, 0X00, 0X02, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, 0X00, 0X40, 0X00, + 0X00, 0X18, 0X00, 0X01, 0X00, 0X00, 0X10, 0X00, 0X02, 0X00, 0X00, 0X20, + 0X00, 0X02, 0X00, 0X00, 0X40, 0X00, 0X04, 0X00, 0X00, 0X40, 0X00, 0X08, + 0X00, 0X00, 0X80, 0X00, 0X08, 0X00, 0X01, 0X00, 0X00, 0X10, 0X00, 0X03, + 0X00, 0X00, 0X20, 0X00, 0X00, 0X20, 0X00, 0X02, 0X00, 0X00, 0X20, 0X00, + 0X02, 0X00, 0X00, 0X20, 0X00, 0X04, 0X00, 0X00, 0X40, 0X00, 0X04, 0X00, + 0X00, 0X40, 0X00, 0X04, 0X00, 0X00, 0X80, 0X00, 0X08, 0X00, 0X00, 0X80, + 0X00, 0X08, 0X00, 0X00, 0X80, 0X00, 0X18, 0X00, 0X00, 0X7F, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, + 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 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, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00}; + +#define BALLWIDTH 136 +#define BALLHEIGHT 100 + +const uint8_t ball[BALLHEIGHT][BALLWIDTH / 2] = { + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X01, 0X11, + 0X11, 0X11, 0X11, 0X11, 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, 0X01, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0XAA, 0XA6, 0X43, 0XDB, 0X00, 0X00, 0X00, 0X00, + 0X01, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 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, 0XAA, 0XAA, + 0X86, 0X43, 0X32, 0XED, 0X33, 0X33, 0X3D, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0XAA, 0XAA, 0X86, 0X54, 0X33, 0X32, 0XED, 0XCC, + 0XCB, 0X9A, 0XA3, 0X33, 0X33, 0X33, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0XAA, + 0X86, 0X55, 0X33, 0X32, 0XFE, 0XDD, 0XCC, 0XCB, 0XA9, 0X88, 0X76, 0XFF, + 0X55, 0X5A, 0X33, 0X33, 0X41, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 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, 0XAA, 0XAA, 0X86, 0X55, 0X43, 0X32, 0XFF, 0XED, + 0XDC, 0XCC, 0XCB, 0XA9, 0X88, 0X87, 0X65, 0X54, 0X33, 0XCB, 0XA9, 0X85, + 0X3C, 0X41, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 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, 0XFD, + 0X86, 0X55, 0X54, 0X32, 0XFF, 0XFF, 0XED, 0XDC, 0XCC, 0XBA, 0XA9, 0X88, + 0X87, 0X65, 0X55, 0X43, 0X32, 0X2F, 0XE6, 0X64, 0X32, 0XC9, 0X41, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 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, 0X03, 0X3F, 0XDC, 0XCA, 0X92, 0XFF, 0XFF, + 0XFE, 0XDD, 0XDC, 0XCB, 0XAA, 0XA9, 0X88, 0X87, 0X66, 0X55, 0X54, 0X33, + 0X22, 0XFE, 0XDD, 0XCB, 0X33, 0XFD, 0XA6, 0X41, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 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, 0X3F, 0XED, 0XCC, 0XA9, 0X88, 0X87, 0XED, 0XDD, 0XCC, 0XCB, 0XAA, + 0XA9, 0X88, 0X88, 0X76, 0X65, 0X54, 0X43, 0X32, 0X2F, 0XEE, 0XDD, 0XCB, + 0XAA, 0X98, 0XDC, 0X96, 0X47, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X33, 0XFD, 0XCC, 0XBA, + 0X98, 0X88, 0X76, 0X65, 0X54, 0XBA, 0XAA, 0XA9, 0X88, 0X88, 0X76, 0X65, + 0X55, 0X44, 0X33, 0X22, 0XFF, 0XED, 0XDC, 0XBB, 0XAA, 0X98, 0X76, 0X5A, + 0X96, 0X48, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X03, 0XFE, 0XDC, 0XCA, 0X98, 0X88, 0X87, 0X66, 0X55, + 0X43, 0X33, 0X22, 0X88, 0X88, 0X76, 0X66, 0X55, 0X54, 0X33, 0X32, 0X2F, + 0XFE, 0XED, 0XDC, 0XBA, 0XAA, 0X98, 0X76, 0X54, 0X32, 0X76, 0X48, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X3F, + 0XED, 0XCB, 0XA9, 0X88, 0X87, 0X76, 0X65, 0X54, 0X33, 0X32, 0X2F, 0XFF, + 0XE6, 0X66, 0X65, 0X55, 0X43, 0X33, 0X22, 0XFF, 0XEE, 0XDD, 0XCC, 0XBA, + 0XA9, 0X98, 0X76, 0X55, 0X32, 0XFE, 0XDC, 0XF8, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X3F, 0XED, 0XCC, 0XBA, 0X98, 0X88, + 0X76, 0X66, 0X55, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XDD, 0XD5, 0X55, 0X44, + 0X33, 0X32, 0X2F, 0XFE, 0XEE, 0XDD, 0XCB, 0XBA, 0XA9, 0X98, 0X76, 0X65, + 0X43, 0X2F, 0XED, 0XC9, 0X88, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X3F, 0XEE, 0XDC, 0XCB, 0XA9, 0X88, 0X87, 0X66, 0X55, 0X44, 0X33, + 0X32, 0X2F, 0XFF, 0XED, 0XDD, 0XCC, 0XCB, 0XB3, 0X33, 0X22, 0XFF, 0XFE, + 0XED, 0XDC, 0XCB, 0XBA, 0XA9, 0X98, 0X76, 0X65, 0X43, 0X2F, 0XED, 0XCB, + 0X98, 0X4F, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X33, 0XFE, 0XED, 0XCB, + 0XA9, 0X88, 0X88, 0X76, 0X65, 0X54, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, + 0XDC, 0XCC, 0XBB, 0XAA, 0XA9, 0X9F, 0XFF, 0XEE, 0XED, 0XDC, 0XCB, 0XBA, + 0XA9, 0X88, 0X76, 0X65, 0X43, 0X32, 0XFE, 0XDC, 0XA9, 0X74, 0XF1, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X03, 0XFE, 0XED, 0XCC, 0XBA, 0X98, 0X88, 0X77, 0X66, + 0X55, 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XAA, + 0X99, 0X98, 0X87, 0XEE, 0XDD, 0XCC, 0XCB, 0XBA, 0XA9, 0X88, 0X77, 0X65, + 0X54, 0X32, 0XFE, 0XDC, 0XC9, 0X86, 0X4F, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X3F, + 0XEE, 0XDC, 0XBB, 0XA9, 0X88, 0X87, 0X76, 0X65, 0X54, 0X43, 0X33, 0X22, + 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0XCB, 0XBA, 0XAA, 0X99, 0X88, 0X77, 0X77, + 0X66, 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X65, 0X54, 0X33, 0X2F, 0XED, + 0XCB, 0X98, 0X64, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XA8, 0XEE, 0XED, 0XCB, 0XBA, 0X98, + 0X88, 0X77, 0X66, 0X55, 0X44, 0X33, 0X33, 0X22, 0XFF, 0XEE, 0XDD, 0XDC, + 0XCC, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X77, 0X76, 0X66, 0X55, 0XBB, 0XAA, + 0X99, 0X88, 0X77, 0X65, 0X54, 0X33, 0X2F, 0XEE, 0XCC, 0XA9, 0X85, 0X2E, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X0A, 0X87, 0X76, 0X5B, 0XBA, 0X98, 0X88, 0X87, 0X66, 0X65, 0X54, + 0X43, 0X33, 0X32, 0X2F, 0XFF, 0XED, 0XDD, 0XCC, 0XCC, 0XBB, 0XAA, 0XA9, + 0X98, 0X87, 0X77, 0X76, 0X65, 0X55, 0X44, 0X33, 0X99, 0X88, 0X77, 0X66, + 0X54, 0X43, 0X22, 0XFE, 0XDC, 0XCA, 0X97, 0X52, 0XE1, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0A, 0X87, 0X65, + 0X44, 0X32, 0X88, 0X87, 0X76, 0X65, 0X54, 0X44, 0X33, 0X33, 0X22, 0XFF, + 0XFE, 0XED, 0XDD, 0XCC, 0XCB, 0XBA, 0XAA, 0X99, 0X98, 0X87, 0X77, 0X66, + 0X65, 0X54, 0X44, 0X33, 0X22, 0XFF, 0X77, 0X66, 0X55, 0X43, 0X32, 0XFE, + 0XED, 0XCB, 0XA9, 0X75, 0X2E, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0XA8, 0X77, 0X65, 0X43, 0X2F, 0XFF, 0XEE, + 0X66, 0X55, 0X44, 0X43, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, + 0XBB, 0XAA, 0XAA, 0X99, 0X88, 0X77, 0X77, 0X66, 0X55, 0X54, 0X43, 0X32, + 0X22, 0XFF, 0XEE, 0X66, 0X55, 0X43, 0X32, 0X2F, 0XEE, 0XCC, 0XB9, 0X86, + 0X52, 0XE1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0XA8, 0X76, 0X54, 0X43, 0X2F, 0XFE, 0XED, 0XDC, 0XC4, 0X44, 0X33, + 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, + 0X88, 0X77, 0X76, 0X66, 0X55, 0X54, 0X43, 0X32, 0X22, 0XFF, 0XEE, 0XDD, + 0XCC, 0X44, 0X33, 0X2F, 0XEE, 0XDC, 0XBA, 0X98, 0X64, 0XF1, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0A, 0X87, 0X65, 0X54, + 0X32, 0XFF, 0XFE, 0XED, 0XCC, 0XBB, 0XBA, 0X33, 0X32, 0X2F, 0XFF, 0XEE, + 0XDD, 0XDC, 0XCC, 0XCB, 0XBA, 0XAA, 0X99, 0X98, 0X87, 0X77, 0X76, 0X66, + 0X55, 0X44, 0X43, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XCC, 0XBB, 0XAA, 0X22, + 0XFE, 0XEC, 0XCB, 0XA9, 0X76, 0X4F, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0XA8, 0X77, 0X65, 0X43, 0X22, 0XFF, 0XEE, 0XDD, + 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, + 0XBA, 0XAA, 0X99, 0X98, 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X33, 0X32, + 0X2F, 0XFE, 0XEE, 0XDD, 0XCC, 0XBB, 0XAA, 0X99, 0XFE, 0XED, 0XCC, 0XBA, + 0X97, 0X64, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0XA8, 0X76, 0X54, 0X43, 0X2F, 0XFE, 0XEE, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, + 0X98, 0X88, 0XEE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, + 0X77, 0X77, 0X66, 0X65, 0X55, 0X44, 0X33, 0X22, 0X2F, 0XFE, 0XED, 0XDD, + 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0XCC, 0XBA, 0X98, 0X75, 0X4F, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X0A, 0X87, 0X76, 0X54, 0X32, + 0X2F, 0XFE, 0XED, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X66, + 0X65, 0XCC, 0XCB, 0XBA, 0XAA, 0XA9, 0X99, 0X88, 0X77, 0X76, 0X66, 0X55, + 0X54, 0X44, 0X33, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XAA, 0X99, + 0X88, 0X77, 0X65, 0X54, 0XA9, 0X86, 0X52, 0XE1, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X0A, 0X87, 0X65, 0X44, 0X32, 0XFF, 0XEE, 0XDD, 0XCC, + 0XBB, 0XBA, 0XAA, 0X99, 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, 0XBB, 0XBA, + 0XAA, 0X99, 0X98, 0X87, 0X77, 0X76, 0X66, 0X55, 0X54, 0X43, 0X33, 0X22, + 0X2F, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X65, 0X54, + 0X33, 0X27, 0X65, 0X2E, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XA8, + 0X76, 0X55, 0X43, 0X22, 0XFF, 0XEE, 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, + 0X88, 0X87, 0X76, 0X66, 0X55, 0X55, 0X44, 0X3A, 0XAA, 0X99, 0X98, 0X87, + 0X77, 0X66, 0X66, 0X55, 0X54, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, + 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X65, 0X54, 0X33, 0X2F, 0XED, 0XC2, + 0XE1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0XA8, 0X76, 0X54, 0X32, 0X2F, + 0XFE, 0XED, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X76, 0X66, + 0X55, 0X54, 0X44, 0X33, 0X32, 0X99, 0X88, 0X77, 0X77, 0X66, 0X65, 0X55, + 0X44, 0X43, 0X32, 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XAA, 0X99, + 0X88, 0X77, 0X66, 0X55, 0X43, 0X2F, 0XED, 0XCB, 0X97, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, + 0X00, 0X00, 0X0A, 0X87, 0X65, 0X54, 0X32, 0X2F, 0XEE, 0XED, 0XDC, 0XCB, + 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X66, 0X65, 0X55, 0X54, 0X43, 0X33, + 0X32, 0X22, 0XFF, 0XE7, 0X76, 0X66, 0X65, 0X55, 0X44, 0X33, 0X32, 0X22, + 0XFF, 0XFE, 0XED, 0XDC, 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X76, 0X55, + 0X43, 0X32, 0XFE, 0XDC, 0X97, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0XA8, 0X76, + 0X55, 0X43, 0X22, 0XFF, 0XEE, 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X88, + 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0X22, 0XFF, 0XEE, + 0XED, 0X66, 0X55, 0X55, 0X44, 0X33, 0X32, 0X22, 0XFF, 0XFE, 0XED, 0XDC, + 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X76, 0X55, 0X43, 0X32, 0XFE, 0XDC, + 0XB9, 0X71, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0XA8, 0X76, 0X54, 0X32, 0X22, 0XFE, + 0XEE, 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, + 0X55, 0X44, 0X33, 0X33, 0X22, 0X2F, 0XFE, 0XEE, 0XED, 0XDD, 0XC5, 0X54, + 0X44, 0X33, 0X32, 0X22, 0XFF, 0XEE, 0XED, 0XDC, 0XCC, 0XBB, 0XAA, 0XA9, + 0X88, 0X77, 0X76, 0X55, 0X43, 0X32, 0XFE, 0XDC, 0XB9, 0X71, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, + 0X00, 0X0A, 0X87, 0X65, 0X54, 0X32, 0X2F, 0XEE, 0XED, 0XDC, 0XCB, 0XBB, + 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X76, 0X66, 0X55, 0X54, 0X44, 0X33, 0X32, + 0X22, 0X2F, 0XFE, 0XEE, 0XDD, 0XDD, 0XCC, 0XC4, 0X43, 0X33, 0X22, 0X2F, + 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XAA, 0XA9, 0X98, 0X87, 0X76, 0X55, + 0X44, 0X32, 0XFE, 0XDD, 0XCA, 0X81, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X0A, 0X87, 0X65, + 0X43, 0X22, 0X2F, 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, + 0X77, 0X66, 0X65, 0X55, 0X54, 0X44, 0X33, 0X32, 0X22, 0XFF, 0XEE, 0XEE, + 0XDD, 0XDC, 0XCC, 0XCB, 0XBA, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, + 0XCC, 0XBB, 0XAA, 0XA9, 0X98, 0X87, 0X76, 0X55, 0X44, 0X33, 0X2F, 0XED, + 0XCB, 0X97, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X10, 0X00, 0X00, 0X3F, 0XED, 0X55, 0X43, 0X22, 0XFE, 0XEE, + 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, + 0X44, 0X43, 0X33, 0X32, 0X22, 0XFF, 0XEE, 0XED, 0XDD, 0XDC, 0XCC, 0XBB, + 0XBA, 0XAA, 0X99, 0X98, 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XAA, 0XA9, + 0X98, 0X87, 0X76, 0X65, 0X54, 0X33, 0X2F, 0XED, 0XCB, 0X97, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, + 0X00, 0X3F, 0XED, 0XCB, 0XA2, 0X22, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XBA, + 0XAA, 0X99, 0X88, 0X87, 0X76, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, + 0X2F, 0XFF, 0XEE, 0XED, 0XDD, 0XCC, 0XCC, 0XBB, 0XAA, 0XAA, 0X99, 0X98, + 0X88, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XAA, 0XA9, 0X98, 0X87, 0X76, 0X65, + 0X54, 0X33, 0X2F, 0XED, 0XDC, 0XA8, 0X51, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X3F, 0XED, 0XCB, + 0XA9, 0X98, 0XEE, 0XED, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, + 0X76, 0X66, 0X55, 0X54, 0X44, 0X33, 0X33, 0X22, 0X2F, 0XFE, 0XEE, 0XED, + 0XDD, 0XCC, 0XCC, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X88, 0X77, 0X6D, 0XDC, + 0XCC, 0XBB, 0XAA, 0XA9, 0X98, 0X87, 0X76, 0X65, 0X54, 0X33, 0X2F, 0XFE, + 0XDC, 0XB9, 0X71, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X3F, 0XED, 0XCB, 0XA9, 0X98, 0X77, 0XDD, + 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X66, 0X66, 0X55, 0X54, + 0X44, 0X33, 0X32, 0X22, 0XFF, 0XFE, 0XEE, 0XDD, 0XDD, 0XCC, 0XCB, 0XBB, + 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X77, 0X66, 0X65, 0XCC, 0XBB, 0XAA, 0XA9, + 0X98, 0X87, 0X77, 0X65, 0X54, 0X43, 0X3F, 0XFE, 0XDC, 0XBA, 0X81, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, + 0X00, 0X3F, 0XDC, 0XBB, 0XA9, 0X98, 0X77, 0X66, 0X55, 0X4B, 0XBA, 0XAA, + 0X99, 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X32, 0X22, + 0XFF, 0XEE, 0XEE, 0XDD, 0XDC, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, + 0X87, 0X76, 0X66, 0X65, 0X55, 0X44, 0X3A, 0XA9, 0X98, 0X87, 0X77, 0X65, + 0X54, 0X43, 0X32, 0XFE, 0XDD, 0XBA, 0X85, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X03, 0XFE, 0XDC, 0XBA, + 0XA9, 0X98, 0X77, 0X66, 0X55, 0X44, 0X4A, 0XAA, 0X99, 0X88, 0X87, 0X76, + 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0XED, 0XDD, + 0XDC, 0XCC, 0XCB, 0XBA, 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, + 0X55, 0X44, 0X33, 0X39, 0X98, 0X87, 0X77, 0X65, 0X54, 0X43, 0X32, 0XFF, + 0XDD, 0XCB, 0X95, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X03, 0XFE, 0XDC, 0XBA, 0X99, 0X88, 0X77, 0X66, + 0X55, 0X44, 0X43, 0X32, 0X2F, 0X88, 0X77, 0X76, 0X66, 0X55, 0X54, 0X44, + 0X43, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0XED, 0XDD, 0XCC, 0XCC, 0XBB, 0XBA, + 0XAA, 0X99, 0X98, 0X88, 0X87, 0X76, 0X66, 0X55, 0X54, 0X44, 0X33, 0X32, + 0X2F, 0XFE, 0X77, 0X66, 0X55, 0X43, 0X32, 0XFF, 0XED, 0XCB, 0XA8, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X03, 0XFE, 0XDC, 0XBA, 0X99, 0X87, 0X76, 0X65, 0X55, 0X44, 0X43, 0X32, + 0X2F, 0XFF, 0X77, 0X66, 0X66, 0X55, 0X54, 0X44, 0X33, 0X33, 0X22, 0XFF, + 0XFE, 0XEE, 0XED, 0XDD, 0XCC, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, + 0X77, 0X76, 0X66, 0X55, 0X54, 0X43, 0X33, 0X32, 0X2F, 0XFE, 0XEE, 0X66, + 0X55, 0X44, 0X33, 0XFF, 0XED, 0XDB, 0XA8, 0X51, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X03, 0XFE, 0XDC, 0XBA, + 0X99, 0X87, 0X76, 0X65, 0X54, 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XD6, + 0X65, 0X55, 0X44, 0X44, 0X33, 0X32, 0X22, 0XFF, 0XFE, 0XEE, 0XDD, 0XDD, + 0XCC, 0XCB, 0XBB, 0XAA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X66, 0X66, 0X55, + 0X54, 0X43, 0X33, 0X22, 0X2F, 0XFE, 0XEE, 0XDD, 0XCC, 0X44, 0X33, 0X2F, + 0XED, 0XDC, 0XB9, 0X51, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X03, 0XFE, 0XDC, 0XBA, 0X99, 0X87, 0X76, 0X65, + 0X54, 0X44, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, 0XB4, 0X43, + 0X33, 0X32, 0X2F, 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, 0XCC, 0XCB, 0XBB, 0XAA, + 0XA9, 0X99, 0X88, 0X88, 0X77, 0X66, 0X65, 0X55, 0X54, 0X43, 0X33, 0X22, + 0XFF, 0XFE, 0XEE, 0XDD, 0XCC, 0XBB, 0XAA, 0X2F, 0XFD, 0XDC, 0XBA, 0X85, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X03, 0XFD, 0XCB, 0XBA, 0X99, 0X87, 0X76, 0X65, 0X54, 0X44, 0X33, 0X22, + 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XBA, 0X33, 0X22, 0X2F, 0XFF, + 0XEE, 0XEE, 0XDD, 0XDC, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, + 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0XFF, 0XEE, 0XED, 0XDD, + 0XCC, 0XBB, 0XAA, 0X98, 0X8E, 0XDD, 0XBA, 0X85, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X03, 0XFD, 0XCB, 0XAA, + 0X99, 0X87, 0X76, 0X65, 0X54, 0X44, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, + 0XDC, 0XCB, 0XBB, 0XBA, 0XAA, 0X22, 0XFF, 0XFF, 0XEE, 0XED, 0XDD, 0XDC, + 0XCC, 0XBB, 0XBA, 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X76, 0X66, 0X65, 0X55, + 0X44, 0X33, 0X33, 0X22, 0XFF, 0XEE, 0XED, 0XDC, 0XCC, 0XBB, 0XAA, 0X98, + 0X87, 0X66, 0XCB, 0XA8, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X03, 0XFD, 0XCB, 0XAA, 0X98, 0X87, 0X76, 0X65, + 0X54, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, + 0XAA, 0X99, 0X8F, 0XFE, 0XEE, 0XED, 0XDD, 0XCC, 0XCC, 0XBB, 0XBA, 0XAA, + 0X99, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, 0X55, 0X44, 0X33, 0X32, 0X22, + 0XFF, 0XEE, 0XED, 0XDC, 0XCB, 0XBA, 0XAA, 0X98, 0X87, 0X66, 0X54, 0X3F, + 0X51, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X03, 0XFD, 0XCB, 0XAA, 0X98, 0X87, 0X66, 0X55, 0X54, 0X43, 0X32, 0X22, + 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, + 0XEE, 0XDD, 0XDD, 0XCC, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X87, + 0X76, 0X66, 0X55, 0X54, 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XED, 0XDC, + 0XCB, 0XBA, 0XA9, 0X98, 0X87, 0X66, 0X54, 0X3F, 0XC1, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X32, 0XFD, 0XCB, 0XAA, + 0X98, 0X87, 0X66, 0X55, 0X44, 0X43, 0X32, 0X22, 0XFF, 0XEE, 0XED, 0XDD, + 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X87, 0X77, 0X6D, 0XDC, 0XCC, + 0XCB, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X76, 0X66, 0X55, 0X54, + 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCB, 0XBA, 0XA9, 0X98, + 0X77, 0X66, 0X54, 0X3F, 0XC1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X3F, 0XED, 0XCB, 0XAA, 0X98, 0X87, 0X66, 0X55, + 0X44, 0X43, 0X32, 0X22, 0XFF, 0XEE, 0XDD, 0XDD, 0XCC, 0XBB, 0XBB, 0XAA, + 0XA9, 0X98, 0X88, 0X77, 0X77, 0X66, 0X65, 0X55, 0X54, 0XBB, 0XAA, 0XAA, + 0X99, 0X98, 0X88, 0X77, 0X66, 0X66, 0X55, 0X54, 0X44, 0X33, 0X32, 0X2F, + 0XFF, 0XEE, 0XDD, 0XCC, 0XCB, 0XBA, 0XA9, 0X88, 0X77, 0X65, 0X44, 0X3F, + 0XC1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, + 0X3F, 0XDC, 0XBB, 0XA9, 0X98, 0X87, 0X66, 0X55, 0X44, 0X43, 0X32, 0X2F, + 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XBA, 0XAA, 0XA9, 0X98, 0X88, 0X77, + 0X76, 0X66, 0X65, 0X55, 0X54, 0X44, 0X3A, 0XA9, 0X99, 0X98, 0X88, 0X77, + 0X66, 0X65, 0X55, 0X54, 0X43, 0X33, 0X32, 0X2F, 0XFE, 0XEE, 0XDD, 0XCC, + 0XCB, 0XBA, 0XA9, 0X88, 0X76, 0X65, 0X43, 0X2F, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X3F, 0XDC, 0XBA, 0XA9, + 0X98, 0X77, 0X66, 0X55, 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, + 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X76, 0X66, 0X55, 0X55, + 0X44, 0X44, 0X33, 0X32, 0X99, 0X88, 0X88, 0X77, 0X66, 0X65, 0X55, 0X44, + 0X43, 0X33, 0X22, 0X2F, 0XFE, 0XEE, 0XDD, 0XCC, 0XCB, 0XBA, 0XA9, 0X88, + 0X76, 0X65, 0X43, 0XFE, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0XAF, 0XDC, 0XBA, 0XA9, 0X88, 0X77, 0X66, 0X55, + 0X44, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XBA, 0XAA, + 0X99, 0X88, 0X88, 0X77, 0X76, 0X66, 0X55, 0X55, 0X44, 0X43, 0X33, 0X32, + 0X22, 0XF8, 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0XFF, + 0XFE, 0XEE, 0XDD, 0XCC, 0XBB, 0XAA, 0XA9, 0X88, 0X76, 0X65, 0X43, 0XFC, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, + 0XA8, 0X65, 0XBA, 0XA9, 0X88, 0X76, 0X65, 0X55, 0X44, 0X33, 0X22, 0X2F, + 0XFE, 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XAA, 0XAA, 0X99, 0X88, 0X87, 0X77, + 0X76, 0X66, 0X55, 0X54, 0X44, 0X43, 0X33, 0X22, 0X22, 0XFF, 0XF7, 0X76, + 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, + 0XBB, 0XAA, 0X99, 0X88, 0X76, 0X65, 0X43, 0XFC, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X9A, 0X65, 0X43, 0X39, + 0X88, 0X76, 0X65, 0X54, 0X44, 0X33, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XDC, + 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X77, 0X66, 0X66, 0X55, 0X54, + 0X44, 0X33, 0X33, 0X22, 0X2F, 0XFF, 0XFE, 0XED, 0X66, 0X55, 0X55, 0X44, + 0X33, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDC, 0XCC, 0XBB, 0XAA, 0X99, 0X87, + 0X76, 0X65, 0X43, 0XFC, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X0A, 0X86, 0X53, 0X32, 0XFF, 0X76, 0X65, 0X54, + 0X43, 0X33, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, + 0X98, 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, 0X54, 0X44, 0X33, 0X32, 0X22, + 0X2F, 0XFF, 0XEE, 0XED, 0XDD, 0XC5, 0X54, 0X44, 0X33, 0X32, 0X22, 0XFF, + 0XFE, 0XED, 0XDC, 0XCC, 0XBB, 0XAA, 0X99, 0X87, 0X76, 0X54, 0X43, 0XFC, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, + 0X0A, 0X86, 0X54, 0X33, 0XFF, 0XED, 0XD5, 0X54, 0X43, 0X32, 0X22, 0XFF, + 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X77, + 0X66, 0X65, 0X55, 0X44, 0X44, 0X33, 0X32, 0X22, 0XFF, 0XFF, 0XEE, 0XDD, + 0XDD, 0XCC, 0XCB, 0XBB, 0XA3, 0X32, 0X2F, 0XFF, 0XEE, 0XED, 0XDC, 0XCC, + 0XBB, 0XAA, 0X99, 0X87, 0X76, 0X54, 0X32, 0XF1, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0XA6, 0X54, 0X33, + 0X2F, 0XED, 0XDC, 0XCB, 0XB3, 0X32, 0X22, 0XFF, 0XEE, 0XED, 0XDD, 0XCC, + 0XBB, 0XBA, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X76, 0X66, 0X65, 0X55, 0X44, + 0X43, 0X33, 0X32, 0X22, 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, 0XCC, 0XCB, 0XBB, + 0XAA, 0XA2, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XAA, 0X99, 0X87, + 0X76, 0X54, 0X32, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0XA8, 0X65, 0X33, 0X2F, 0XFD, 0XDC, 0XCB, + 0XBA, 0XA9, 0X22, 0XFF, 0XEE, 0XDD, 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, + 0X98, 0X88, 0X77, 0X76, 0X66, 0X55, 0X54, 0X44, 0X43, 0X33, 0X22, 0X22, + 0XFF, 0XFE, 0XED, 0XDD, 0XDC, 0XCC, 0XBB, 0XBA, 0XAA, 0XA9, 0X98, 0XFF, + 0XEE, 0XDD, 0XCC, 0XCB, 0XBA, 0XAA, 0X99, 0X87, 0X76, 0X54, 0X32, 0XF1, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, + 0X00, 0XA8, 0X65, 0X43, 0X2F, 0XFE, 0XDD, 0XCB, 0XBA, 0XA9, 0X99, 0X88, + 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X88, 0X88, 0X77, 0X76, + 0X66, 0X55, 0X54, 0X44, 0X33, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0XED, 0XDD, + 0XCC, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0XDD, 0XCC, 0XCB, + 0XBA, 0XA9, 0X98, 0X87, 0X66, 0X54, 0X32, 0XF1, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X0A, 0X65, 0X43, + 0X3F, 0XFE, 0XDD, 0XCC, 0XBB, 0XA9, 0X99, 0X88, 0X77, 0X6D, 0XDC, 0XCB, + 0XBB, 0XBA, 0XAA, 0X99, 0X88, 0X87, 0X77, 0X66, 0X66, 0X55, 0X54, 0X44, + 0X33, 0X32, 0X22, 0X2F, 0XFF, 0XEE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, + 0XAA, 0X99, 0X88, 0X87, 0X76, 0X66, 0X5C, 0XCB, 0XBA, 0XA9, 0X98, 0X77, + 0X66, 0X54, 0X32, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X0A, 0X86, 0X53, 0X32, 0XFE, 0XDD, 0XCC, + 0XBB, 0XA9, 0X99, 0X88, 0X77, 0X66, 0X65, 0X54, 0XBB, 0XAA, 0XAA, 0X99, + 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X44, 0X33, 0X32, 0X22, 0XFF, + 0XFE, 0XEE, 0XDD, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, + 0X76, 0X66, 0X55, 0X54, 0X4A, 0XA9, 0X98, 0X77, 0X65, 0X44, 0X3F, 0XC1, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, + 0X00, 0X0A, 0X96, 0X54, 0X32, 0XFF, 0XDD, 0XCC, 0XBB, 0XA9, 0X99, 0X88, + 0X77, 0X66, 0X65, 0X54, 0X44, 0X3A, 0XA9, 0X99, 0X88, 0X87, 0X77, 0X66, + 0X65, 0X55, 0X44, 0X43, 0X33, 0X32, 0X22, 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, + 0XCC, 0XBB, 0XBA, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X66, 0X65, 0X55, 0X44, + 0X33, 0X39, 0X98, 0X77, 0X65, 0X43, 0X2F, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X0A, 0X96, 0X54, + 0X33, 0XFF, 0XED, 0XDC, 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X66, 0X65, 0X54, + 0X44, 0X33, 0X39, 0X98, 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, + 0X33, 0X22, 0X22, 0XFF, 0XEE, 0XED, 0XDD, 0XDC, 0XCC, 0XBB, 0XBA, 0XAA, + 0X99, 0X98, 0X88, 0X77, 0X66, 0X65, 0X55, 0X44, 0X33, 0X22, 0X2F, 0XEE, + 0X65, 0X43, 0X2F, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0XA8, 0X64, 0X33, 0X2F, 0XED, 0XDC, + 0XBB, 0XAA, 0X99, 0X88, 0X77, 0X66, 0X65, 0X54, 0X44, 0X33, 0X32, 0X2F, + 0X88, 0X77, 0X76, 0X66, 0X65, 0X54, 0X44, 0X43, 0X33, 0X22, 0X2F, 0XFF, + 0XEE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XAA, 0X99, 0X88, 0X87, 0X76, + 0X66, 0X55, 0X54, 0X43, 0X33, 0X22, 0XFE, 0XED, 0XDC, 0X43, 0X2F, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, + 0X00, 0X00, 0XA9, 0X65, 0X43, 0X2F, 0XED, 0XDC, 0XBB, 0XAA, 0X99, 0X88, + 0X77, 0X66, 0X65, 0X54, 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XED, 0X66, + 0X55, 0X54, 0X44, 0X33, 0X33, 0X22, 0X2F, 0XFE, 0XEE, 0XDD, 0XDD, 0XCC, + 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, 0X54, 0X43, + 0X32, 0X22, 0XFE, 0XED, 0XCB, 0XBA, 0X98, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0XA9, 0X65, + 0X43, 0X2F, 0XED, 0XDC, 0XCB, 0XBA, 0X99, 0X88, 0X77, 0X66, 0X65, 0X54, + 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XED, 0XDD, 0X55, 0X44, 0X44, 0X33, + 0X32, 0X22, 0X2F, 0XFE, 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XBB, 0XAA, 0XA9, + 0X98, 0X88, 0X77, 0X66, 0X65, 0X55, 0X44, 0X33, 0X32, 0X2F, 0XEE, 0XDD, + 0XCB, 0XA9, 0X81, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X0A, 0X86, 0X43, 0X32, 0XFE, 0XDC, + 0XCB, 0XBA, 0X99, 0X98, 0X77, 0X66, 0X65, 0X54, 0X44, 0X33, 0X22, 0X2F, + 0XFF, 0XEE, 0XDD, 0XDD, 0XCC, 0XB4, 0X43, 0X33, 0X32, 0X22, 0XFF, 0XEE, + 0XEE, 0XDD, 0XDC, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X66, + 0X65, 0X55, 0X44, 0X33, 0X22, 0XFF, 0XEE, 0XDC, 0XBB, 0XA9, 0X81, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, + 0X00, 0X00, 0X0A, 0X96, 0X54, 0X32, 0XFE, 0XDD, 0XCB, 0XBA, 0X99, 0X98, + 0X87, 0X66, 0X65, 0X54, 0X44, 0X33, 0X22, 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, + 0XCC, 0XBB, 0XBA, 0X33, 0X22, 0X22, 0XFF, 0XEE, 0XED, 0XDD, 0XDC, 0XCB, + 0XBB, 0XBA, 0XAA, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, 0X54, 0X43, 0X32, + 0X22, 0XFE, 0XED, 0XCC, 0XBA, 0X98, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X0A, 0X96, + 0X54, 0X32, 0XFE, 0XDD, 0XCB, 0XBA, 0X99, 0X98, 0X87, 0X76, 0X65, 0X54, + 0X44, 0X33, 0X22, 0XFF, 0XFE, 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XBA, 0XAA, + 0X92, 0X2F, 0XFE, 0XEE, 0XED, 0XDD, 0XCC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, + 0X88, 0X87, 0X76, 0X66, 0X55, 0X54, 0X43, 0X32, 0X2F, 0XFE, 0XDD, 0XCB, + 0XA9, 0X98, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0XA9, 0X64, 0X32, 0XFE, 0XDD, + 0XCB, 0XBA, 0X99, 0X98, 0X87, 0X76, 0X65, 0X54, 0X43, 0X33, 0X22, 0XFF, + 0XFE, 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X98, 0X87, 0XEE, + 0XDD, 0XDD, 0XCC, 0XBB, 0XBB, 0XAA, 0XA9, 0X98, 0X88, 0X77, 0X66, 0X65, + 0X55, 0X44, 0X33, 0X22, 0X2F, 0XEE, 0XDC, 0XBB, 0XA9, 0X81, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X32, 0XD5, 0X43, 0X2F, 0XED, 0XCB, 0XBA, 0XA9, 0X98, + 0X87, 0X76, 0X65, 0X54, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, + 0XCB, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X77, 0X6D, 0XDC, 0XCC, 0XBB, + 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X66, 0X65, 0X55, 0X44, 0X33, 0X22, + 0XFF, 0XED, 0XDC, 0XBA, 0X98, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, + 0X2D, 0XBA, 0X9F, 0XED, 0XDC, 0XBB, 0XA9, 0X98, 0X87, 0X76, 0X65, 0X54, + 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, + 0X99, 0X88, 0X77, 0X76, 0X66, 0X6C, 0XCB, 0XBB, 0XBA, 0XAA, 0X99, 0X88, + 0X87, 0X76, 0X66, 0X55, 0X54, 0X43, 0X32, 0X2F, 0XFE, 0XED, 0XCB, 0XBA, + 0X98, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X32, 0XDB, 0XA9, 0X7D, + 0XDC, 0XBB, 0XA9, 0X98, 0X87, 0X76, 0X65, 0X54, 0X43, 0X33, 0X22, 0XFF, + 0XEE, 0XED, 0XDD, 0XCC, 0XBB, 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X76, + 0X66, 0X55, 0X54, 0XBB, 0XAA, 0XA9, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, + 0X54, 0X43, 0X32, 0X2F, 0XFE, 0XDC, 0XCB, 0XA9, 0X81, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X03, 0X2D, 0XBA, 0X87, 0X65, 0X44, 0XA9, 0X98, + 0X87, 0X76, 0X65, 0X54, 0X43, 0X33, 0X22, 0XFF, 0XEE, 0XED, 0XDC, 0XCC, + 0XBB, 0XBA, 0XA9, 0X99, 0X98, 0X87, 0X77, 0X66, 0X66, 0X55, 0X44, 0X44, + 0X33, 0X39, 0X98, 0X88, 0X77, 0X66, 0X65, 0X55, 0X44, 0X33, 0X22, 0XFF, + 0XEE, 0XDC, 0XBA, 0X99, 0X81, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X3F, 0XCB, 0X98, 0X76, 0X54, 0X42, 0X28, 0X87, 0X76, 0X65, 0X54, + 0X43, 0X32, 0X22, 0XFF, 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XAA, 0XA9, 0X99, + 0X88, 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0X28, 0X88, + 0X77, 0X66, 0X65, 0X55, 0X44, 0X32, 0X2F, 0XFF, 0XED, 0XCC, 0XBA, 0X98, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0XFC, 0XA9, + 0X76, 0X54, 0X43, 0X22, 0XF7, 0X76, 0X65, 0X54, 0X43, 0X32, 0X2F, 0XFF, + 0XEE, 0XDD, 0XDC, 0XCB, 0XBB, 0XAA, 0X99, 0X99, 0X88, 0X77, 0X76, 0X66, + 0X55, 0X54, 0X44, 0X33, 0X32, 0X22, 0XFF, 0XFE, 0XED, 0X66, 0X55, 0X54, + 0X43, 0X32, 0X2F, 0XFE, 0XDC, 0XCB, 0XA9, 0X98, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X3F, 0XCA, 0X97, 0X65, 0X44, 0X22, + 0XFE, 0XED, 0XD5, 0X54, 0X43, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XCC, 0XCB, + 0XBA, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X76, 0X66, 0X55, 0X44, 0X44, 0X33, + 0X22, 0X2F, 0XFF, 0XEE, 0XDD, 0XDD, 0X55, 0X54, 0X43, 0X22, 0XFF, 0XFE, + 0XDC, 0XBA, 0X99, 0X81, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X03, 0XFC, 0XA8, 0X76, 0X54, 0X32, 0X2F, 0XED, 0XDC, 0XCB, + 0XB3, 0X32, 0X2F, 0XFE, 0XEE, 0XDD, 0XCC, 0XBB, 0XBA, 0XA9, 0X99, 0X98, + 0X87, 0X77, 0X66, 0X65, 0X55, 0X44, 0X43, 0X33, 0X22, 0XFF, 0XFE, 0XED, + 0XDD, 0XDC, 0XCC, 0XBB, 0X33, 0X22, 0XFF, 0XED, 0XCC, 0XBA, 0X98, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0X2D, + 0XCA, 0X87, 0X54, 0X42, 0X2F, 0XEE, 0XDD, 0XCB, 0XBA, 0XA2, 0X2F, 0XFE, + 0XED, 0XDD, 0XCC, 0XBB, 0XBA, 0XA9, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, + 0X54, 0X44, 0X33, 0X32, 0X22, 0XFF, 0XEE, 0XDD, 0XDD, 0XCC, 0XCB, 0XBA, + 0XA9, 0X9F, 0XFF, 0XED, 0XCB, 0XA9, 0X98, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X32, 0XDB, 0X98, 0X75, 0X43, + 0X22, 0XFE, 0XDD, 0XCC, 0XBA, 0XA9, 0X98, 0X8E, 0XED, 0XDC, 0XCC, 0XBB, + 0XAA, 0X99, 0X99, 0X88, 0X77, 0X76, 0X66, 0X55, 0X44, 0X43, 0X33, 0X22, + 0X2F, 0XFE, 0XED, 0XDD, 0XDC, 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X87, 0X6C, + 0XCB, 0XA9, 0X81, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X03, 0X2D, 0XB9, 0X76, 0X54, 0X32, 0XFE, 0XED, 0XCC, + 0XBB, 0XA9, 0X98, 0X87, 0X76, 0X6C, 0XCB, 0XBB, 0XAA, 0X99, 0X98, 0X88, + 0X77, 0X66, 0X65, 0X54, 0X44, 0X43, 0X32, 0X22, 0XFF, 0XEE, 0XDD, 0XDD, + 0XCC, 0XCB, 0XBA, 0XA9, 0X98, 0X88, 0X76, 0X55, 0X43, 0X99, 0X81, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X32, 0XDB, 0X87, 0X64, 0X42, 0X2F, 0XED, 0XDC, 0XBB, 0XA9, 0X98, 0X87, + 0X76, 0X65, 0X5B, 0XBA, 0XA9, 0X99, 0X98, 0X87, 0X77, 0X66, 0X65, 0X54, + 0X44, 0X33, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XDC, 0XCB, 0XBA, 0XAA, 0X98, + 0X88, 0X87, 0X65, 0X54, 0X32, 0X2F, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X03, 0XFC, 0XA8, 0X75, + 0X43, 0X2F, 0XEE, 0XDC, 0XBB, 0XA9, 0X98, 0X87, 0X76, 0X65, 0X54, 0X43, + 0X32, 0X99, 0X88, 0X87, 0X76, 0X66, 0X55, 0X44, 0X43, 0X32, 0X22, 0XFF, + 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X87, 0X65, 0X54, 0X43, + 0X22, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X3F, 0XCA, 0X87, 0X44, 0X32, 0XFE, 0XDC, + 0XCB, 0XA9, 0X98, 0X87, 0X66, 0X55, 0X44, 0X43, 0X22, 0X22, 0X88, 0X77, + 0X76, 0X65, 0X54, 0X44, 0X33, 0X32, 0X2F, 0XFF, 0XEE, 0XDD, 0XDC, 0XCB, + 0XBA, 0XA9, 0X98, 0X88, 0X76, 0X55, 0X43, 0X22, 0XF1, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X03, 0XFC, 0X97, 0X64, 0X32, 0XFE, 0XDD, 0XCB, 0XAA, 0X98, 0X87, + 0X66, 0X55, 0X44, 0X33, 0X22, 0X2F, 0XFF, 0XEE, 0X66, 0X65, 0X54, 0X44, + 0X33, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XAA, 0X99, 0X88, 0X87, + 0X65, 0X44, 0X32, 0X2F, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0X78, + 0X75, 0X43, 0X2F, 0XED, 0XCB, 0XAA, 0X98, 0X77, 0X66, 0X55, 0X44, 0X32, + 0X22, 0XFF, 0XFE, 0XED, 0XDD, 0XCC, 0X44, 0X43, 0X32, 0X22, 0XFF, 0XEE, + 0XDD, 0XDC, 0XCB, 0XBA, 0XA9, 0X88, 0X88, 0X76, 0X54, 0X43, 0X2F, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0X7E, 0X43, 0X2F, 0XED, + 0XCB, 0XBA, 0X98, 0X77, 0X66, 0X54, 0X43, 0X32, 0X22, 0XFF, 0XEE, 0XDD, + 0XDC, 0XCB, 0XBB, 0XAA, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XAA, + 0X98, 0X88, 0X76, 0X55, 0X43, 0X22, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0XAA, 0X7E, 0XA9, 0XFE, 0XDC, 0XBA, 0X98, 0X77, + 0X66, 0X54, 0X43, 0X22, 0X2F, 0XFE, 0XED, 0XDD, 0XCC, 0XBB, 0XBA, 0XA9, + 0X99, 0XFF, 0XEE, 0XDD, 0XDC, 0XBB, 0XAA, 0XA9, 0X88, 0X87, 0X65, 0X44, + 0X32, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0XAA, 0X7E, 0XA9, 0X6C, 0XBA, 0X98, 0X76, 0X66, 0X54, 0X33, 0X22, + 0XFF, 0XEE, 0XDD, 0XDC, 0XBB, 0XBA, 0XA9, 0X99, 0X98, 0X87, 0X7D, 0XDD, + 0XCB, 0XBA, 0XA9, 0X98, 0X88, 0X76, 0X54, 0X43, 0XF1, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0X7E, + 0XA7, 0X53, 0X98, 0X76, 0X65, 0X54, 0X32, 0X2F, 0XFE, 0XED, 0XDD, 0XCB, + 0XBB, 0XAA, 0X99, 0X98, 0X88, 0X77, 0X66, 0X65, 0X44, 0XAA, 0X98, 0X88, + 0X87, 0X64, 0X43, 0X2F, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 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, 0XAA, 0X7B, 0X96, 0X3F, 0XE6, + 0X65, 0X43, 0X32, 0X2F, 0XEE, 0XDD, 0XCC, 0XBB, 0XBA, 0X99, 0X98, 0X88, + 0X77, 0X66, 0X65, 0X44, 0X33, 0X32, 0X88, 0X87, 0X65, 0X44, 0X3F, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 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, 0XAA, 0X7B, 0X93, 0XFE, 0XDC, 0XB3, 0X22, 0XFE, + 0XED, 0XDC, 0XCB, 0XBA, 0XA9, 0X98, 0X88, 0X77, 0X66, 0X65, 0X44, 0X33, + 0X32, 0XFF, 0XFF, 0XED, 0X44, 0X43, 0XF1, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 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, 0XAA, 0X7B, 0X5F, 0XDC, 0XAA, 0X98, 0XEE, 0XDD, 0XCB, 0XBB, 0XA9, + 0X98, 0X88, 0X77, 0X66, 0X54, 0X43, 0X33, 0X2F, 0XFF, 0XFF, 0XED, 0XBB, + 0XBA, 0X81, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 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, 0XAA, 0X7B, + 0XEB, 0XA9, 0X77, 0X76, 0X65, 0XBB, 0XBA, 0X98, 0X88, 0X77, 0X65, 0X44, + 0X43, 0X32, 0XFF, 0XFF, 0XED, 0XDB, 0XBB, 0XBA, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAA, 0XB9, 0X77, 0X64, 0X44, + 0X44, 0X43, 0X28, 0X88, 0X77, 0X65, 0X44, 0X43, 0X32, 0XFF, 0XED, 0XDC, + 0XBB, 0XBA, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0XAB, 0XBF, 0XFF, 0XFF, 0XFF, 0XEC, + 0X54, 0X44, 0X33, 0X2F, 0XED, 0XDD, 0XBB, 0XBA, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 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, 0X66, 0XAB, 0XBB, 0XBA, 0X97, 0XED, 0XDD, + 0XDB, 0XBA, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, 0X11, + 0X11, 0X11, 0X11, 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, 0X66, 0X66, 0X53, 0XBA, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X01, 0X11, 0X11, 0X11, 0X11, 0X11, 0X10, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, + 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00, 0X00}; diff --git a/PicoW_YBox3/weather_sprites.h b/PicoW_YBox3/weather_sprites.h new file mode 100644 index 000000000..4aababf8a --- /dev/null +++ b/PicoW_YBox3/weather_sprites.h @@ -0,0 +1,1721 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT +// 'sunnyDay', 45x32px +const uint16_t sunnyDay [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, 15, + 12, 12, 12, 12, 12, 15, 15, 15, 15, 13, 14, 15, 15, 12, 12, 12, + 13, 13, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, + 12, 12, 15, 15, 15, 15, 13, 13, 15, 15, 12, 12, 12, 13, 13, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 14, 14, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, + 13, 14, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, + 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 14, 14, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 13, 13, 15, + 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 13, 14, 14, + 14, 13, 13, 13, 13, 13, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 13, 13, 14, 14, 13, 13, + 13, 13, 13, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, + 4, 4, 4, 11, 11, 11, 11, 14, 14, 13, 13, 14, 14, 14, 14, 14, + 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, + 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, + 11, 11, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 13, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 4, + 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 13, + 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 13, 12, 12, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 14, 14, 15, 15, 13, 13, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 13, 15, 15, 14, 14, 15, + 12, 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 14, 14, 15, 15, 13, 13, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 13, 13, 15, 15, 14, 14, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 14, 14, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, + 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 14, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 14, 14, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, + 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 14, 14, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, + 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 14, 14, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 13, 13, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 13, 13, 15, 15, 15, 15, 15, 12, 12, + 12, 12, 15, 15, 15, 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, + 4, 14, 14, 15, 15, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 13, 13, 15, 15, 14, 14, 15, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 14, 14, + 15, 15, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 13, 13, 15, 15, 14, 14, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 13, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 13, 12, 12, + 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, + 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 13, 13, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 13, 13, 12, 12, 15, 15, 15, + 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, 4, 4, 4, + 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 13, 13, 13, + 13, 14, 14, 14, 14, 14, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, + 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 14, 13, 13, 13, 14, 14, + 14, 14, 14, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, + 15, 15, 15, 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, + 4, 14, 14, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 13, 14, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, + 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 14, 14, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 13, 13, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 4, + 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, + 11, 14, 13, 11, 11, 4, 4, 4, 14, 14, 12, 12, 12, 12, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 14, 14, + 11, 11, 4, 4, 4, 14, 14, 12, 12, 12, 12, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, + 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, + 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15 +}; +// 'drizzleDay', 45x32px +const uint16_t drizzleDay [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 17, 18, + 18, 18, 18, 17, 17, 17, 17, 17, 18, 11, 11, 11, 4, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 18, 17, 18, 18, 18, + 17, 17, 17, 17, 17, 18, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 4, 15, 15, 15, 15, 15, 12, 12, 12, 12, + 15, 15, 15, 15, 17, 18, 18, 18, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 0, 18, 18, 18, 17, 17, 17, 15, 15, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, + 4, 17, 18, 18, 18, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 18, 18, 18, 17, 17, 17, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 18, 17, + 17, 17, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 17, 17, 17, + 18, 18, 18, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 12, 18, 18, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 17, 18, 17, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 18, 18, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 17, 18, 17, + 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 18, 18, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 17, 18, 17, 4, 4, 4, + 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, + 17, 17, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 17, 17, 18, 12, 12, 12, 15, 15, 15, + 15, 15, 4, 4, 4, 4, 17, 18, 18, 18, 18, 17, 17, 17, 17, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 17, 17, 18, 18, 18, 12, 15, 15, 15, 15, 15, 4, + 4, 4, 4, 17, 18, 18, 18, 18, 17, 17, 17, 17, 0, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 17, 17, 18, 18, 18, 12, 15, 15, 15, 15, 15, 4, 4, 17, 17, + 17, 18, 18, 10, 10, 10, 10, 10, 10, 18, 17, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 10, 10, 18, 17, 17, 17, 15, 15, 4, 4, 17, 17, 17, 18, 18, + 10, 10, 10, 10, 10, 10, 18, 17, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 10, 10, + 18, 17, 17, 17, 15, 15, 12, 12, 18, 18, 0, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 18, + 18, 11, 11, 12, 12, 18, 18, 0, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 18, 18, 11, 11, + 12, 12, 18, 18, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, + 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, 18, 18, 11, 11, 12, 12, 18, + 18, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 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, 18, 18, 11, 11, 4, 4, 17, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 17, 17, 17, 15, 15, 4, 4, 17, 17, 17, 18, 18, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, + 18, 17, 15, 15, 12, 12, 18, 17, 17, 18, 18, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 4, 11, 11, 11, 11, + 11, 12, 12, 12, 12, 18, 17, 18, 18, 18, 17, 17, 17, 17, 17, 18, + 18, 18, 18, 17, 17, 17, 17, 18, 18, 18, 18, 18, 17, 17, 17, 17, + 18, 18, 18, 18, 18, 17, 17, 17, 4, 11, 11, 11, 11, 11, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, + 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, + 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, 12, 17, 18, + 11, 11, 11, 4, 4, 4, 17, 18, 11, 11, 11, 4, 4, 4, 4, 17, + 18, 11, 11, 11, 4, 4, 4, 17, 17, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 15, 15, 15, 15, 15, 12, 12, 12, 12, 17, 17, 11, 11, 11, + 4, 4, 4, 17, 18, 11, 11, 11, 4, 4, 4, 4, 17, 18, 11, 11, + 11, 4, 4, 4, 17, 17, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 18, 18, 11, 11, 17, 18, 12, 12, + 18, 17, 15, 15, 15, 18, 11, 11, 11, 18, 17, 15, 15, 17, 18, 12, + 12, 18, 18, 15, 15, 15, 15, 12, 12, 12, 12, 12, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 18, 18, 11, 11, 18, 17, 12, 12, 18, 17, 15, + 15, 15, 18, 12, 12, 12, 18, 17, 15, 15, 17, 18, 12, 12, 18, 18, + 15, 15, 15, 15, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 18, 17, 4, 4, 4, 11, 11, 11, 11, 17, + 11, 11, 11, 11, 4, 4, 4, 17, 18, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 18, 17, 4, 4, 4, 11, 11, 11, 11, 17, 15, 15, 15, + 15, 12, 12, 12, 17, 18, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 12, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4 +}; +// 'rainDay', 45x32px +const uint16_t rainDay [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, + 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 17, + 17, 17, 17, 18, 18, 18, 18, 18, 17, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, + 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 18, 17, 17, 17, + 18, 18, 18, 18, 18, 17, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 18, 17, 17, 17, 17, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 0, 17, 17, 17, 18, 18, 18, 18, 12, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, + 11, 18, 17, 17, 17, 17, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 17, 17, 17, 18, 18, 18, 18, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 17, 17, 19, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 17, 18, 11, 11, 11, 4, 4, 4, 4, 4, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 15, 15, 17, 17, 0, 0, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 17, 18, 11, 11, 11, 4, 4, 4, 4, 4, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 15, 15, 17, 17, 0, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 17, 18, + 11, 11, 11, 4, 4, 4, 4, 4, 15, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 17, 17, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 17, 18, 11, 11, 11, + 4, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, + 18, 18, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 18, 17, 15, 15, 15, 12, 12, 12, + 12, 12, 11, 11, 11, 11, 11, 17, 17, 17, 17, 18, 18, 18, 18, 0, + 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 18, 17, 17, 17, 15, 12, 12, 12, 12, 12, 11, + 11, 11, 11, 11, 17, 17, 17, 17, 18, 18, 18, 18, 0, 0, 0, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 18, 17, 17, 17, 15, 12, 12, 12, 12, 12, 11, 11, 11, 18, + 18, 17, 17, 10, 10, 10, 10, 10, 10, 17, 17, 17, 0, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 0, 10, 10, 17, 18, 18, 18, 12, 12, 11, 11, 11, 18, 18, 17, 17, + 10, 10, 10, 10, 10, 10, 17, 17, 17, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 10, 10, + 17, 18, 18, 18, 12, 12, 15, 15, 15, 17, 17, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 17, + 17, 4, 4, 15, 15, 15, 17, 17, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 17, 17, 4, 4, + 15, 15, 15, 17, 17, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 4, 4, 15, 15, 15, + 17, 17, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 17, 4, 4, 11, 11, 11, 18, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 17, 17, 18, 12, 12, 11, 11, 11, 18, 18, 17, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 17, + 17, 17, 12, 12, 15, 15, 15, 18, 18, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 11, 4, 4, 4, 4, + 4, 15, 15, 15, 15, 15, 18, 17, 17, 17, 18, 18, 18, 18, 18, 17, + 17, 17, 17, 18, 18, 18, 18, 17, 17, 17, 17, 17, 18, 18, 18, 18, + 17, 17, 17, 17, 17, 18, 18, 18, 11, 4, 4, 4, 4, 4, 15, 15, + 15, 15, 0, 0, 0, 4, 4, 18, 18, 12, 12, 18, 17, 15, 15, 15, + 0, 0, 11, 11, 17, 17, 15, 15, 0, 0, 12, 12, 18, 17, 15, 15, + 0, 0, 0, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 0, + 0, 0, 12, 12, 17, 17, 4, 4, 17, 18, 11, 11, 11, 0, 0, 15, + 15, 18, 18, 11, 11, 0, 0, 4, 4, 17, 18, 11, 11, 0, 0, 0, + 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 0, 0, 0, 12, + 12, 17, 17, 4, 4, 17, 18, 11, 11, 11, 0, 0, 15, 15, 18, 18, + 11, 11, 0, 0, 4, 4, 17, 18, 11, 11, 0, 0, 0, 4, 4, 4, + 11, 11, 11, 11, 11, 12, 12, 0, 0, 11, 4, 4, 17, 18, 4, 4, + 17, 17, 4, 11, 11, 0, 0, 11, 11, 18, 17, 12, 12, 0, 0, 11, + 4, 17, 17, 4, 11, 0, 0, 11, 11, 4, 17, 17, 4, 11, 11, 11, + 11, 11, 12, 12, 0, 0, 11, 4, 4, 17, 17, 4, 4, 17, 17, 4, + 11, 11, 0, 0, 11, 11, 18, 18, 4, 4, 0, 0, 11, 4, 17, 17, + 4, 11, 0, 0, 11, 11, 4, 17, 17, 4, 11, 11, 11, 11, 11, 4, + 4, 4, 4, 4, 18, 18, 11, 11, 17, 18, 12, 12, 0, 0, 0, 12, + 12, 17, 17, 15, 15, 0, 0, 15, 15, 17, 18, 12, 12, 0, 0, 15, + 15, 17, 17, 18, 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, 4, 4, + 4, 18, 18, 11, 11, 17, 17, 12, 12, 0, 0, 0, 12, 12, 17, 17, + 15, 15, 0, 0, 15, 15, 17, 18, 12, 12, 0, 0, 15, 15, 17, 17, + 18, 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, 4, 17, 17, 11, 11, + 18, 18, 4, 4, 0, 0, 15, 12, 12, 18, 18, 15, 15, 0, 0, 12, + 12, 17, 17, 15, 12, 0, 0, 12, 15, 17, 17, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 4, 4, 4, 17, 17, 11, 11, 18, 18, 4, + 4, 0, 0, 15, 12, 12, 18, 18, 15, 15, 0, 0, 12, 12, 18, 17, + 15, 12, 0, 0, 12, 15, 17, 17, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11 +}; +// 'thunderNight', 45x32px +const uint16_t thunderNight [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 23, 21, 20, 20, 20, 20, 20, 20, 20, 15, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, + 11, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 21, + 20, 20, 20, 20, 20, 20, 20, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 20, 20, 24, 25, + 22, 22, 22, 22, 22, 22, 26, 27, 27, 27, 27, 27, 28, 26, 26, 22, + 22, 22, 24, 24, 29, 20, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 12, 20, 20, 24, 25, 22, 22, 22, + 22, 22, 22, 26, 27, 27, 27, 27, 27, 26, 28, 28, 22, 22, 22, 24, + 24, 20, 20, 11, 11, 11, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 20, 20, 24, 25, 22, 22, 22, 22, 22, 22, + 26, 27, 27, 27, 27, 27, 28, 26, 28, 22, 22, 22, 22, 22, 20, 20, + 11, 11, 11, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 20, 20, 24, 25, 22, 22, 22, 22, 22, 22, 26, 27, 27, + 27, 27, 27, 28, 22, 22, 22, 22, 22, 22, 22, 20, 20, 11, 11, 11, + 4, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, + 20, 20, 25, 24, 22, 22, 22, 22, 22, 22, 26, 28, 28, 28, 28, 28, + 27, 22, 22, 22, 22, 22, 22, 22, 20, 20, 12, 12, 12, 15, 15, 15, + 15, 15, 11, 11, 11, 11, 29, 20, 20, 20, 20, 20, 20, 20, 20, 25, + 24, 22, 22, 22, 22, 26, 28, 28, 26, 28, 28, 28, 22, 22, 22, 22, + 22, 22, 22, 23, 23, 20, 20, 20, 20, 12, 15, 15, 15, 15, 15, 11, + 11, 11, 11, 29, 20, 20, 20, 20, 20, 20, 20, 20, 25, 24, 22, 22, + 22, 22, 26, 28, 28, 27, 26, 28, 28, 22, 22, 22, 22, 22, 22, 22, + 24, 23, 20, 20, 20, 20, 12, 15, 15, 15, 15, 15, 11, 11, 29, 20, + 20, 20, 20, 22, 22, 22, 22, 22, 22, 20, 20, 25, 21, 22, 22, 26, + 28, 28, 27, 27, 26, 28, 28, 27, 27, 27, 22, 22, 22, 24, 24, 24, + 25, 22, 22, 20, 20, 20, 20, 15, 15, 11, 11, 29, 20, 20, 20, 20, + 22, 22, 22, 22, 22, 22, 20, 20, 25, 21, 22, 22, 26, 28, 28, 27, + 27, 27, 26, 28, 27, 27, 27, 22, 22, 22, 24, 24, 24, 25, 22, 22, + 20, 20, 20, 20, 15, 15, 12, 12, 20, 20, 25, 25, 25, 22, 22, 22, + 22, 22, 22, 22, 22, 25, 23, 28, 26, 26, 27, 27, 28, 28, 28, 28, + 27, 28, 28, 28, 22, 22, 22, 25, 25, 22, 22, 22, 22, 22, 22, 20, + 20, 4, 4, 12, 12, 20, 20, 25, 25, 25, 22, 22, 22, 22, 22, 22, + 22, 22, 25, 23, 28, 26, 26, 26, 27, 28, 28, 28, 28, 28, 26, 28, + 28, 22, 22, 22, 25, 25, 22, 22, 22, 22, 22, 22, 20, 20, 4, 4, + 12, 12, 20, 20, 25, 25, 25, 25, 25, 22, 22, 22, 22, 22, 22, 22, + 22, 25, 21, 21, 21, 26, 28, 28, 28, 28, 28, 27, 25, 23, 23, 25, + 25, 25, 25, 25, 24, 24, 24, 24, 25, 20, 20, 4, 4, 12, 12, 20, + 20, 25, 25, 25, 25, 25, 22, 22, 22, 22, 22, 22, 22, 22, 25, 21, + 21, 21, 26, 28, 28, 28, 28, 28, 27, 25, 25, 23, 21, 25, 25, 25, + 25, 24, 24, 24, 24, 25, 20, 20, 4, 4, 11, 11, 29, 20, 25, 24, + 24, 24, 24, 25, 25, 25, 25, 25, 24, 24, 24, 24, 23, 23, 23, 28, + 27, 27, 27, 27, 25, 24, 24, 24, 21, 23, 23, 24, 24, 24, 25, 25, + 25, 20, 20, 20, 20, 15, 15, 11, 11, 29, 20, 20, 20, 20, 24, 24, + 25, 25, 25, 25, 25, 24, 24, 24, 24, 25, 23, 23, 28, 27, 27, 27, + 27, 25, 24, 24, 24, 24, 25, 23, 23, 24, 24, 25, 25, 25, 20, 20, + 20, 20, 15, 15, 11, 11, 29, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 30, 30, 27, 27, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 12, 15, 15, 15, 15, + 15, 11, 11, 11, 11, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 30, 30, 26, 27, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 12, 15, 15, 15, 15, 15, 11, 11, + 11, 11, 24, 25, 31, 12, 12, 20, 20, 12, 12, 20, 20, 15, 15, 21, + 23, 23, 30, 30, 20, 20, 12, 12, 25, 24, 15, 15, 20, 20, 12, 12, + 25, 25, 24, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 21, + 24, 15, 15, 15, 20, 20, 11, 11, 20, 20, 4, 4, 25, 21, 21, 26, + 26, 20, 20, 11, 11, 24, 25, 12, 12, 20, 20, 11, 11, 21, 24, 25, + 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 21, 23, 15, 15, + 15, 20, 20, 11, 11, 20, 20, 4, 4, 25, 21, 21, 26, 26, 20, 20, + 11, 11, 24, 25, 12, 12, 20, 20, 11, 11, 21, 24, 25, 12, 12, 12, + 15, 15, 15, 15, 15, 15, 15, 24, 24, 15, 12, 12, 20, 20, 12, 12, + 20, 20, 11, 4, 25, 25, 26, 28, 26, 20, 20, 11, 11, 21, 21, 11, + 4, 20, 20, 4, 11, 21, 21, 31, 11, 4, 20, 20, 4, 11, 11, 11, + 11, 11, 15, 15, 24, 24, 15, 12, 12, 20, 20, 12, 12, 20, 20, 11, + 4, 25, 25, 26, 28, 28, 20, 20, 11, 11, 21, 21, 11, 4, 20, 20, + 4, 11, 21, 21, 31, 11, 4, 20, 20, 4, 11, 11, 11, 11, 11, 4, + 4, 4, 4, 20, 20, 20, 15, 15, 20, 20, 11, 11, 21, 24, 15, 15, + 20, 20, 20, 15, 15, 23, 23, 4, 4, 20, 20, 15, 15, 21, 23, 4, + 4, 20, 20, 20, 15, 15, 15, 12, 12, 12, 12, 12, 4, 4, 4, 4, + 20, 20, 20, 15, 15, 20, 20, 11, 11, 21, 23, 15, 15, 20, 20, 20, + 15, 15, 23, 23, 4, 4, 20, 20, 15, 15, 21, 23, 4, 4, 20, 20, + 20, 15, 15, 15, 12, 12, 12, 12, 12, 4, 4, 20, 20, 12, 15, 15, + 20, 20, 12, 12, 25, 21, 11, 4, 20, 20, 12, 15, 15, 21, 21, 4, + 4, 20, 20, 12, 15, 21, 21, 11, 4, 20, 20, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 4, 4, 20, 20, 12, 15, 15, 20, 20, 12, + 12, 25, 25, 12, 15, 20, 20, 12, 15, 15, 21, 21, 4, 4, 20, 20, + 12, 15, 21, 21, 11, 4, 20, 20, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 12, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11 +}; +// 'fogDay', 45x32px +const uint16_t fogDay [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 18, 18, + 17, 17, 17, 17, 17, 18, 18, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 4, 15, 15, 15, 15, 15, 12, 12, 12, 12, + 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 17, 18, 17, 17, 17, + 17, 17, 18, 18, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 18, 18, 17, 17, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 17, 18, 17, 17, 17, 17, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, + 15, 17, 17, 18, 18, 10, 10, 10, 10, 10, 10, 10, 0, 0, 17, 17, + 18, 18, 18, 18, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 18, 17, 17, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 17, 17, 15, 15, 15, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, + 4, 4, 4, 4, 11, 11, 11, 11, 18, 17, 17, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 17, 17, + 15, 15, 15, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 11, 11, 11, 11, 18, 17, 17, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 17, 17, 15, 15, 15, + 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 17, 18, 18, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 17, 18, 11, 11, 11, 4, 4, 4, + 4, 4, 15, 15, 15, 15, 15, 12, 12, 12, 18, 17, 17, 17, 17, 17, + 18, 18, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 17, 18, 18, 18, 11, 4, 4, 4, 4, 4, 15, + 15, 15, 15, 15, 12, 12, 12, 18, 17, 17, 17, 17, 17, 18, 18, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 17, 18, 18, 18, 11, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 11, 18, 18, 18, 17, 10, 10, 10, 10, 10, 10, 18, 18, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 0, 10, 10, 17, 17, 17, 17, 15, 15, 4, 4, 4, 4, 4, 11, 18, + 18, 18, 17, 10, 10, 10, 10, 10, 10, 18, 18, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 10, 10, + 17, 17, 17, 17, 15, 15, 12, 12, 12, 12, 12, 15, 17, 17, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 17, + 18, 11, 11, 12, 12, 12, 12, 12, 15, 17, 17, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 17, 18, 11, 11, + 12, 12, 12, 12, 12, 15, 17, 17, 0, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 11, 11, 12, 12, 12, + 12, 12, 15, 17, 17, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 18, 11, 11, 4, 4, 4, 4, 4, 11, + 18, 18, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 18, 17, 17, 15, 15, 4, 4, 4, 4, 4, 11, 18, 18, 18, + 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, + 18, 17, 15, 15, 11, 0, 0, 15, 15, 12, 12, 12, 18, 17, 17, 17, + 17, 17, 18, 18, 18, 18, 17, 17, 17, 17, 18, 18, 18, 18, 18, 17, + 17, 17, 17, 18, 18, 18, 18, 18, 17, 17, 17, 15, 12, 12, 12, 12, + 12, 11, 0, 0, 15, 15, 12, 12, 12, 18, 17, 17, 17, 17, 17, 18, + 18, 18, 18, 17, 17, 17, 17, 18, 18, 18, 18, 18, 17, 17, 17, 17, + 18, 18, 18, 18, 18, 17, 17, 17, 15, 12, 12, 12, 12, 12, 11, 11, + 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 11, + 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, + 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 12, 12, 12, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 15, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 12, 12, 12, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, + 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, + 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 11, 4, 4, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, + 15, 15, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 11, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, + 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15 +}; +// 'snowNight', 45x32px +const uint16_t snowNight [] PROGMEM = { + 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, + 12, 12, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 15, 15, 15, + 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 20, 20, 20, 20, 22, 22, 22, 22, + 22, 22, 22, 25, 25, 24, 20, 20, 20, 20, 20, 20, 15, 15, 12, 12, + 12, 12, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 11, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, + 25, 25, 24, 20, 20, 20, 20, 20, 20, 15, 15, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, + 20, 20, 25, 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 23, 23, 20, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 20, 20, 24, + 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 21, 21, 20, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 4, 4, + 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 20, 20, 24, 24, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 20, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 4, 4, 4, 4, 4, + 11, 11, 11, 11, 4, 4, 4, 20, 20, 24, 24, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 20, 12, 15, + 15, 15, 15, 12, 12, 12, 12, 12, 4, 4, 4, 4, 4, 11, 20, 20, + 20, 20, 20, 20, 20, 20, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 20, 20, 20, 20, 15, 15, + 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 20, 20, 20, 20, 20, + 20, 20, 20, 25, 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 25, 25, 20, 20, 20, 20, 4, 4, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, + 20, 20, 23, 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 25, 25, 25, 22, 22, 22, 20, 20, 20, 11, 11, 11, 11, 15, + 15, 15, 15, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 20, 20, 23, + 23, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 25, + 25, 25, 22, 22, 22, 20, 20, 20, 11, 11, 11, 11, 15, 15, 15, 15, + 20, 20, 25, 25, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 21, 21, + 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 25, 25, 22, 22, + 22, 22, 22, 20, 20, 11, 11, 11, 11, 15, 15, 15, 15, 20, 20, 25, + 25, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 21, 21, 21, 21, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 25, 25, 22, 22, 22, 22, 22, + 20, 20, 11, 11, 11, 11, 4, 4, 4, 4, 20, 20, 24, 24, 24, 25, + 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 21, 21, 21, 21, + 21, 23, 23, 23, 23, 21, 24, 24, 24, 24, 25, 25, 25, 20, 20, 12, + 12, 12, 12, 4, 4, 4, 4, 20, 20, 24, 24, 24, 25, 22, 22, 22, + 22, 22, 22, 22, 22, 23, 23, 23, 23, 21, 21, 21, 21, 21, 23, 23, + 23, 23, 21, 21, 24, 24, 24, 25, 25, 25, 20, 20, 12, 12, 12, 12, + 4, 4, 4, 4, 20, 20, 20, 20, 24, 25, 25, 25, 25, 25, 24, 24, + 24, 24, 25, 23, 23, 23, 21, 21, 21, 21, 21, 23, 23, 23, 23, 21, + 21, 21, 24, 24, 25, 25, 20, 20, 20, 12, 12, 12, 12, 4, 4, 4, + 4, 20, 20, 20, 20, 24, 25, 25, 25, 25, 25, 24, 24, 24, 24, 25, + 25, 23, 23, 21, 21, 21, 21, 21, 23, 23, 23, 23, 21, 21, 21, 21, + 24, 25, 25, 20, 20, 20, 12, 12, 12, 12, 4, 4, 4, 4, 4, 11, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 15, 15, 12, 12, 12, 12, 12, 4, 4, 4, 4, 4, 11, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 15, 15, 12, + 12, 12, 12, 12, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 4, 4, 4, 25, 23, 4, 4, 4, 4, 11, 11, 24, 24, + 4, 4, 4, 4, 11, 11, 21, 31, 11, 4, 4, 4, 4, 11, 21, 21, + 11, 11, 4, 4, 4, 25, 21, 11, 11, 11, 11, 4, 4, 4, 4, 4, + 11, 11, 11, 24, 25, 12, 12, 12, 12, 15, 15, 25, 25, 11, 11, 11, + 11, 4, 4, 23, 4, 4, 11, 11, 11, 11, 4, 23, 23, 4, 4, 11, + 11, 11, 21, 23, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 11, 11, + 11, 4, 4, 4, 25, 25, 15, 15, 15, 15, 12, 12, 21, 21, 4, 4, + 4, 4, 4, 11, 21, 21, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, + 4, 25, 25, 15, 15, 15, 15, 12, 12, 25, 21, 4, 4, 4, 4, 4, + 11, 21, 21, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 11, 11, 11, 11, 21, 21, 21, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, + 4, 4, 25, 24, 23, 4, 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 4, 23, 23, 4, 11, 11, 11, 11, 11, 4, 4, 23, 23, 11, 11, + 11, 11, 4, 4, 25, 32, 4, 11, 11, 11, 11, 4, 25, 25, 4, 4, + 11, 11, 11, 21, 25, 31, 11, 11, 11, 12, 12, 12, 12, 12, 15, 23, + 23, 4, 11, 11, 11, 11, 11, 4, 4, 23, 23, 11, 11, 11, 11, 4, + 4, 25, 32, 4, 11, 11, 11, 11, 4, 25, 25, 4, 4, 11, 11, 11, + 21, 25, 31, 12, 12, 12, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 23, 24, 4, 4, 4, 4, 11, 11, 21, 21, 4, 4, 4, 4, + 4, 11, 24, 24, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 23, + 23, 15, 15, 15, 15, 12, 12, 21, 21, 4, 4, 4, 4, 4, 11, 24, + 24, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4 +}; +// 'clearNight', 45x32px +const uint16_t clearNight [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 15, 15, 15, 15, 34, 33, 15, 15, 15, + 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, + 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 34, 35, 15, 15, 15, 12, 12, 12, + 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 34, 35, + 35, 35, 35, 34, 34, 34, 34, 35, 35, 35, 35, 12, 15, 15, 15, 15, + 12, 36, 36, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 36, 35, 35, 35, 35, + 34, 34, 34, 34, 35, 35, 35, 35, 12, 15, 15, 15, 15, 12, 36, 36, + 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 36, 36, 36, 33, 37, 37, 37, 38, 38, 38, + 38, 37, 37, 37, 37, 35, 34, 15, 15, 15, 12, 12, 12, 12, 12, 15, + 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 36, 36, 36, 33, 37, 37, 37, 38, 38, 38, 38, 37, 37, + 37, 37, 35, 34, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, + 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 33, 33, 33, 36, 38, 38, 38, 37, 37, 37, 37, 38, 38, 38, 38, 34, + 35, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, 35, 34, 34, 34, 33, 37, + 38, 38, 38, 38, 37, 33, 33, 33, 36, 36, 36, 36, 34, 35, 35, 35, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 12, 12, 12, 35, 34, 34, 34, 34, 38, 37, 37, 37, + 37, 38, 33, 33, 33, 36, 36, 36, 36, 36, 33, 35, 35, 12, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 12, 12, 12, 35, 34, 34, 38, 38, 38, 37, 37, 37, 35, 34, 34, + 33, 4, 11, 11, 11, 11, 11, 4, 33, 35, 12, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 15, 33, 33, 15, 15, 15, 15, 15, 15, 15, 12, 12, + 12, 35, 34, 34, 38, 38, 38, 37, 37, 37, 35, 34, 34, 34, 4, 11, + 11, 11, 11, 11, 4, 33, 33, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 11, 33, 33, 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, 36, 35, + 35, 37, 37, 37, 38, 38, 38, 34, 35, 11, 11, 11, 4, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 11, 11, 11, 36, 33, 35, 37, 37, + 37, 38, 38, 38, 34, 35, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, + 4, 4, 33, 33, 4, 11, 11, 11, 36, 33, 33, 37, 37, 37, 38, 38, + 38, 34, 35, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 4, 4, 33, + 33, 4, 11, 11, 11, 36, 33, 33, 37, 37, 37, 38, 38, 38, 34, 35, + 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, + 4, 4, 33, 36, 36, 38, 38, 38, 37, 37, 37, 35, 34, 34, 34, 4, + 11, 11, 11, 11, 11, 4, 33, 33, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 4, 4, 4, 33, + 36, 36, 38, 38, 38, 37, 37, 37, 35, 34, 34, 34, 4, 11, 11, 11, + 11, 11, 4, 33, 33, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 4, 4, 4, 33, 36, 36, 36, + 36, 38, 37, 37, 37, 37, 38, 34, 34, 34, 35, 35, 35, 35, 35, 34, + 33, 33, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 4, 4, 4, 33, 36, 36, 36, 36, 38, 37, + 37, 37, 37, 38, 34, 34, 34, 35, 35, 35, 35, 35, 34, 34, 33, 4, + 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 4, 4, 4, 4, 11, 11, 36, 36, 36, 33, 37, 37, 37, + 38, 38, 38, 38, 37, 37, 37, 37, 35, 34, 4, 4, 4, 11, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, + 11, 11, 11, 11, 4, 4, 33, 33, 33, 36, 38, 38, 38, 37, 37, 37, + 37, 38, 38, 38, 38, 34, 35, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 11, 11, + 11, 4, 4, 4, 4, 33, 36, 36, 36, 36, 33, 33, 33, 33, 36, 36, + 36, 36, 12, 15, 15, 15, 15, 12, 12, 12, 36, 36, 33, 15, 15, 15, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 35, 36, 36, 36, 36, 33, 33, 33, 33, 36, 36, 36, 36, 12, + 15, 15, 15, 15, 12, 12, 12, 36, 36, 33, 15, 15, 15, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 15, 34, 34, 15, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 15, 33, 35, 12, 15, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 15, 33, 33, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, + 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, + 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12 +}; +// 'partCloudDay', 45x32px +const uint16_t partCloudDay [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, + 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 12, 13, 14, 15, 12, 12, 12, 13, + 13, 14, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, + 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 15, 15, 15, 15, 15, 12, 13, 13, 15, 12, 12, 12, 13, 13, 14, 4, + 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, 15, + 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 13, 14, 14, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 14, 13, 12, 12, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, + 12, 12, 15, 15, 15, 15, 12, 12, 12, 13, 14, 14, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 14, 14, 15, + 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 14, 13, 13, + 14, 14, 14, 14, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, + 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, + 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 14, 14, 13, 14, 14, 14, + 14, 14, 13, 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, 4, 4, 4, + 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, + 4, 11, 11, 11, 11, 13, 14, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 13, 13, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 14, 13, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 14, 4, + 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 13, 13, 11, 4, 4, 14, 14, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 13, 11, 11, + 13, 13, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 13, 13, 11, 4, 4, 14, 14, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, 16, 14, 13, 11, 11, 13, 13, 12, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 17, 17, + 17, 18, 18, 18, 18, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 14, 13, 11, 11, 11, 11, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 17, 17, 17, 18, 18, + 18, 18, 17, 17, 17, 17, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 14, 13, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, + 15, 15, 12, 12, 18, 18, 18, 17, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 0, 17, 18, 18, 18, 18, 17, 39, 16, 16, 16, 16, 16, 16, + 14, 13, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, + 12, 18, 18, 18, 17, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 17, 18, 18, 18, 18, 17, 39, 16, 16, 16, 16, 16, 16, 14, 13, 11, + 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, 17, 18, 18, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 0, 17, 18, 16, 16, 16, 16, 16, 14, 13, 11, 11, 13, 13, + 4, 4, 4, 4, 4, 11, 11, 11, 18, 17, 17, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 17, 17, 39, 16, 16, 16, 16, 13, 14, 15, 15, 14, 14, 4, 4, 4, + 4, 4, 11, 11, 11, 18, 17, 17, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 17, 17, 39, + 16, 16, 14, 14, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, + 15, 15, 17, 17, 17, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 17, 17, 39, 16, 16, 14, + 14, 4, 11, 11, 11, 11, 11, 12, 12, 18, 18, 18, 17, 17, 17, 17, + 18, 17, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 17, 17, 17, 17, 17, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 17, 18, 18, 17, 17, 17, 17, 18, 18, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 17, 17, 17, 17, 18, 12, 12, 12, 15, 15, 15, 15, + 15, 17, 17, 17, 17, 10, 10, 10, 10, 10, 10, 10, 17, 17, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 0, 0, 10, 10, 10, 18, 18, 18, 17, 14, 14, 15, 15, 17, 17, + 17, 17, 10, 10, 10, 10, 10, 10, 10, 18, 18, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 10, 10, 10, 18, 18, 18, 17, 14, 14, 15, 15, 17, 17, 0, 0, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 18, 17, 15, 15, 15, 15, 18, 18, 0, 0, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 17, + 18, 11, 11, 11, 11, 18, 18, 0, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, 17, 18, 11, 11, + 11, 11, 18, 18, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 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, 17, 18, 11, 11, 11, 11, 18, + 18, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 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, 17, 18, 11, 11, 11, 11, 18, 18, 18, 18, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 18, 18, 18, 18, 11, 11, 11, 11, 18, 18, 18, 18, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 18, + 18, 17, 15, 15, 15, 15, 4, 4, 17, 18, 18, 17, 17, 17, 17, 18, + 18, 18, 18, 18, 17, 17, 17, 17, 18, 18, 18, 18, 17, 17, 17, 17, + 17, 18, 18, 18, 18, 17, 17, 17, 17, 17, 18, 12, 12, 12, 15, 15, + 15, 15, 15, 4, 4, 17, 17, 18, 17, 17, 17, 17, 18, 18, 18, 18, + 18, 17, 17, 17, 17, 18, 18, 18, 18, 17, 17, 17, 17, 17, 18, 18, + 18, 18, 17, 17, 17, 17, 17, 18, 12, 12, 12, 15, 15, 15, 15, 15 +}; +// 'partCloudNight', 45x32px +const uint16_t partCloudNight [] PROGMEM = { + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 35, 35, 35, 37, 37, 37, 37, 37, 37, 37, 37, + 37, 37, 37, 35, 35, 11, 11, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 34, 34, 34, 39, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 34, 34, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 34, + 34, 34, 39, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, 34, 34, 4, + 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 36, 36, 36, 35, 37, 37, 37, + 37, 37, 37, 37, 33, 33, 33, 33, 33, 33, 35, 35, 35, 35, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 36, 36, 36, 36, 37, 37, 37, 37, 37, 37, + 37, 33, 33, 33, 33, 33, 33, 33, 35, 35, 35, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 36, 36, 38, 38, 38, 38, 38, 38, 38, 36, 36, 33, 33, + 4, 4, 4, 4, 4, 4, 33, 35, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 33, 33, 40, 37, 37, 37, 37, 37, 37, 33, 33, 33, 36, 11, 11, 11, + 11, 11, 11, 36, 34, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 20, 29, 29, 29, 29, 29, 29, 29, 29, 29, 35, 33, 40, + 37, 37, 37, 37, 37, 37, 33, 33, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 35, 35, 37, 37, 37, 37, + 37, 37, 37, 33, 33, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 29, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 34, 34, 39, 38, 38, 38, 38, 38, 38, + 36, 36, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 29, 20, 20, 20, 22, 22, 22, 22, 22, 22, + 22, 22, 25, 23, 20, 20, 20, 20, 20, 20, 20, 38, 38, 36, 36, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 22, 21, + 21, 20, 20, 20, 20, 20, 20, 20, 37, 37, 33, 33, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 20, 20, + 25, 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 24, 24, 20, 20, 33, 33, 33, 33, 15, 15, 15, 15, 15, + 15, 33, 33, 15, 15, 15, 15, 15, 15, 15, 15, 20, 20, 25, 25, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 24, 24, 20, 20, 33, 33, 33, 33, 15, 15, 15, 15, 15, 15, 33, 33, + 12, 12, 12, 12, 12, 12, 12, 12, 20, 20, 25, 24, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 20, + 20, 38, 38, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 12, 12, 12, + 12, 12, 12, 12, 12, 20, 20, 25, 24, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 20, 20, 38, 38, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 11, 11, 20, 20, 20, 20, + 20, 20, 20, 20, 25, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 23, 23, 20, 20, 20, 20, 38, 38, 38, + 38, 38, 38, 36, 36, 11, 11, 4, 4, 20, 20, 20, 20, 20, 20, 20, + 20, 25, 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 21, 21, 20, 20, 20, 20, 37, 37, 37, 37, 37, 37, + 33, 33, 4, 4, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 25, 25, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 21, 21, 21, 21, 22, 22, 20, 20, 20, 20, 33, 33, 4, 4, 4, + 4, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 20, 20, 25, 21, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, + 23, 23, 22, 22, 20, 20, 20, 20, 36, 36, 11, 11, 11, 11, 20, 20, + 20, 20, 22, 22, 22, 22, 22, 22, 20, 20, 25, 21, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 22, + 22, 20, 20, 20, 20, 36, 36, 11, 11, 11, 11, 20, 20, 24, 24, 22, + 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 21, 21, 21, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 22, 22, 22, 22, 22, 22, + 20, 20, 4, 4, 4, 4, 4, 4, 20, 20, 25, 25, 22, 22, 22, 22, + 22, 22, 22, 22, 25, 23, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 21, 21, 22, 22, 22, 22, 22, 22, 20, 20, 15, + 15, 15, 15, 15, 15, 20, 20, 25, 25, 25, 25, 22, 22, 22, 22, 22, + 22, 22, 22, 25, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, + 24, 24, 21, 21, 21, 21, 21, 21, 21, 21, 20, 20, 15, 15, 15, 15, + 15, 15, 20, 20, 25, 25, 25, 25, 22, 22, 22, 22, 22, 22, 22, 22, + 25, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, + 21, 21, 21, 21, 21, 21, 21, 20, 20, 15, 15, 15, 15, 15, 15, 20, + 20, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, 25, 25, 23, 23, + 23, 23, 20, 20, 20, 20, 4, 4, 4, 4, 4, 4, 20, 20, 20, 20, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 25, 25, 25, 25, 25, 23, 23, 23, 20, + 20, 20, 20, 4, 4, 4, 4, 4, 4, 20, 20, 20, 20, 25, 25, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 23, 23, 23, 23, 23, 23, + 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 21, 21, 20, 20, 20, 20, + 15, 15, 15, 15, 15, 15, 11, 11, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 11, 11, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15 +}; +// 'cloudNight', 45x32px +const uint16_t cloudNight [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 20, 29, 29, 29, 29, 20, 20, 20, 20, 20, 29, 11, 11, 11, + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 12, 12, 20, 29, 29, 29, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 24, 25, 20, 20, 20, 29, 29, 29, 12, 12, 15, + 15, 15, 15, 12, 12, 12, 12, 12, 4, 4, 4, 4, 4, 11, 11, 11, + 11, 4, 4, 4, 4, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 24, 25, 20, 20, 20, 20, 20, 20, 12, 12, 15, 15, 15, 15, + 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 22, 22, 25, + 24, 20, 20, 20, 20, 20, 20, 11, 11, 4, 4, 4, 4, 11, 11, 11, + 11, 11, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 20, 20, 25, + 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 25, 23, 20, 20, 20, 4, 4, 4, 11, 11, 11, 11, 11, 15, + 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 20, 20, 25, 24, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 25, + 23, 20, 20, 20, 4, 4, 4, 11, 11, 11, 11, 11, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 15, 15, 20, 20, 25, 24, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 20, 20, + 20, 4, 4, 4, 11, 11, 11, 11, 11, 15, 15, 15, 15, 15, 12, 12, + 12, 12, 15, 15, 20, 20, 25, 24, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 20, 20, 20, 4, 4, + 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 24, 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 21, 24, 20, 20, 20, 20, 20, 15, 12, 12, + 12, 12, 12, 4, 4, 4, 4, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 24, 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 21, 24, 20, 20, 20, 20, 20, 15, 12, 12, 12, 12, 12, + 4, 4, 20, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 20, 20, 25, + 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 21, 24, 24, 24, 25, 22, 22, 20, 20, 20, 20, 12, 12, 4, 4, 20, + 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 20, 20, 25, 25, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 24, 24, + 24, 25, 22, 22, 20, 20, 20, 20, 12, 12, 15, 15, 20, 20, 25, 25, + 25, 22, 22, 22, 22, 22, 22, 22, 22, 25, 24, 24, 25, 25, 25, 25, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 25, 25, 22, 22, 22, 22, + 22, 22, 22, 20, 20, 11, 11, 15, 15, 20, 20, 25, 25, 25, 22, 22, + 22, 22, 22, 22, 22, 22, 25, 23, 24, 25, 25, 25, 25, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 25, 25, 22, 22, 22, 22, 22, 22, 22, + 20, 20, 11, 11, 15, 15, 20, 20, 25, 25, 25, 25, 25, 22, 22, 22, + 22, 22, 22, 22, 22, 25, 25, 25, 25, 25, 24, 24, 24, 24, 24, 25, + 21, 21, 21, 23, 23, 25, 25, 25, 24, 24, 24, 24, 25, 20, 20, 11, + 11, 15, 15, 20, 20, 25, 25, 25, 25, 25, 22, 22, 22, 22, 22, 22, + 22, 22, 25, 21, 25, 25, 25, 24, 24, 24, 24, 24, 25, 25, 21, 21, + 23, 23, 23, 25, 25, 24, 24, 24, 24, 25, 20, 20, 11, 11, 15, 15, + 20, 20, 20, 20, 20, 25, 25, 24, 24, 24, 24, 24, 25, 25, 25, 25, + 21, 21, 25, 25, 24, 24, 24, 24, 24, 25, 25, 25, 21, 23, 23, 23, + 23, 25, 24, 24, 24, 20, 20, 20, 20, 11, 11, 4, 4, 20, 20, 20, + 20, 20, 24, 24, 25, 25, 25, 25, 25, 24, 24, 24, 24, 25, 23, 23, + 24, 25, 25, 25, 25, 25, 24, 24, 24, 24, 21, 21, 21, 21, 21, 25, + 25, 25, 20, 20, 20, 20, 12, 12, 4, 4, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 4, + 11, 11, 11, 11, 11, 15, 15, 15, 15, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 4, 11, 11, 11, + 11, 11, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, + 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, + 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12 +}; +// 'cloudDay', 45x32px +const uint16_t cloudDay [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 17, 18, 18, 18, 18, 17, 17, 17, 17, 17, 18, 11, 11, 11, + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 18, + 17, 18, 18, 18, 17, 17, 17, 17, 17, 18, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 15, 15, 15, 15, 17, 18, 18, 18, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 18, 18, 18, 17, 17, 17, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, + 11, 4, 4, 4, 4, 17, 18, 18, 18, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 18, 18, 18, 17, 17, 17, 15, 15, 12, 12, 12, 12, + 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 18, 17, 17, 17, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 17, 17, 17, 18, 18, 18, 11, 11, 4, 4, 4, 4, 11, 11, 11, + 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 18, 18, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 17, 18, 17, 4, 4, 4, 11, 11, 11, 11, 11, 12, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 18, 18, 0, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 17, 18, 17, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 18, 18, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 17, 18, + 17, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, + 15, 15, 12, 12, 18, 18, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 17, 18, 17, 4, 4, + 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 17, 18, 18, 18, 18, 17, + 17, 17, 17, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 0, 0, 17, 17, 18, 18, 18, 12, 15, 15, + 15, 15, 15, 4, 4, 4, 4, 17, 18, 18, 18, 18, 17, 17, 17, 17, + 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 17, 17, 18, 18, 18, 12, 15, 15, 15, 15, 15, + 4, 4, 17, 17, 17, 18, 10, 10, 10, 10, 10, 10, 10, 18, 17, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 0, 0, 0, 10, 10, 18, 17, 17, 17, 15, 15, 4, 4, 17, + 17, 17, 18, 10, 10, 10, 10, 10, 10, 10, 18, 17, 0, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, + 0, 0, 10, 10, 18, 17, 17, 17, 15, 15, 12, 12, 18, 18, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, + 10, 10, 10, 18, 18, 11, 11, 12, 12, 18, 18, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 10, + 18, 18, 11, 11, 12, 12, 18, 18, 0, 0, 0, 0, 10, 10, 10, 10, + 10, 10, 10, 10, 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, 18, 18, 11, + 11, 12, 12, 18, 18, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 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, 18, 18, 11, 11, 12, 12, + 18, 18, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 18, 17, 17, 18, 11, 11, 4, 4, 17, 17, 17, + 18, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 18, 18, 17, 15, 15, 12, 12, 17, 17, 17, 18, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 4, + 11, 11, 11, 11, 11, 12, 12, 12, 12, 18, 18, 18, 18, 18, 17, 17, + 17, 17, 17, 18, 18, 18, 18, 17, 17, 17, 17, 18, 18, 18, 18, 18, + 17, 17, 17, 17, 18, 18, 18, 18, 18, 17, 17, 17, 4, 11, 11, 11, + 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, + 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, + 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15 +}; +// 'vCloudDay', 45x32px +const uint16_t vCloudDay [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 15, 15, 15, 15, 15, 12, 12, 12, 12, + 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 18, 17, 17, 17, + 17, 17, 18, 18, 18, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 4, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, + 15, 15, 12, 12, 12, 12, 15, 15, 15, 17, 17, 17, 17, 17, 17, 18, + 18, 18, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 4, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, + 17, 17, 17, 18, 18, 18, 0, 0, 10, 10, 10, 10, 10, 10, 10, 17, + 18, 18, 18, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 17, 17, 17, + 18, 18, 18, 0, 0, 10, 10, 10, 10, 10, 10, 10, 17, 18, 18, 18, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 12, 18, 18, 17, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 17, 18, 17, + 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 18, 18, 17, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 17, 18, 17, 4, 4, 4, + 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, + 4, 17, 17, 18, 18, 18, 18, 17, 17, 17, 17, 18, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 0, 17, 17, 18, 12, 12, 12, 15, 15, 15, + 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 17, 17, + 18, 18, 18, 18, 17, 17, 17, 17, 18, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 17, 17, 18, 12, 12, 12, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 12, 12, 12, 12, 17, 17, 17, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 0, 17, 17, 17, 17, 18, 18, 10, 10, 10, 10, + 0, 17, 17, 18, 18, 18, 18, 17, 17, 17, 4, 4, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 17, 17, 17, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 0, 17, 17, 17, 17, 18, 18, 10, 10, 10, 10, 0, 17, 17, + 18, 18, 18, 18, 17, 17, 17, 4, 4, 4, 4, 4, 4, 4, 11, 18, + 18, 18, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 0, 18, 0, 0, 0, 17, 10, 10, 10, 10, 10, + 10, 10, 17, 17, 17, 15, 12, 12, 12, 12, 12, 15, 17, 17, 17, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 0, 17, 0, 0, 0, 18, 10, 10, 10, 10, 10, 10, 10, 18, + 18, 18, 11, 12, 12, 12, 12, 12, 15, 17, 17, 17, 0, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 17, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 18, 11, + 12, 12, 12, 12, 12, 15, 17, 17, 17, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 17, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 18, 11, 12, 18, 18, + 18, 18, 17, 17, 17, 17, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 17, 17, 18, 18, 10, 10, + 10, 10, 10, 10, 0, 0, 0, 0, 18, 11, 4, 17, 17, 17, 17, 18, + 18, 18, 18, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 0, 18, 18, 17, 17, 10, 10, 10, 10, 10, + 10, 0, 0, 0, 0, 17, 15, 4, 17, 10, 10, 10, 10, 10, 10, 10, + 17, 17, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 0, 0, 0, 10, 10, 10, 18, 18, 18, 0, 0, 0, 0, 0, + 17, 17, 17, 15, 4, 17, 10, 10, 10, 10, 10, 10, 10, 17, 17, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 0, 0, 10, 10, 10, 18, 18, 18, 0, 0, 0, 0, 0, 17, 17, 17, + 15, 15, 17, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 10, 10, + 10, 10, 10, 17, 18, 17, 17, 17, 17, 18, 17, 17, 4, 4, 15, 17, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 10, 10, 10, 10, 10, + 17, 18, 17, 17, 17, 17, 18, 18, 17, 4, 4, 15, 18, 0, 0, 10, + 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 15, 17, 0, 0, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 11, 11, 11, 11, + 4, 4, 4, 4, 4, 15, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 17, 17, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 17, 17, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, + 17, 18, 18, 18, 17, 17, 17, 17, 18, 18, 18, 18, 18, 17, 17, 17, + 17, 18, 18, 18, 18, 17, 17, 17, 17, 17, 18, 18, 18, 18, 17, 17, + 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 15, 17, 17, 18, + 18, 17, 17, 17, 17, 18, 18, 18, 18, 18, 17, 17, 17, 17, 18, 18, + 18, 18, 17, 17, 17, 17, 17, 18, 18, 18, 18, 17, 17, 4, 4, 4, + 11, 11, 11, 11, 4, 4, 4, 4, 4, 15, 15, 15, 15, 15, 12, 12, + 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, + 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12 +}; +// 'vCloudNight', 45x32px +const uint16_t vCloudNight [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 29, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 29, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 20, + 20, 20, 20, 20, 20, 25, 25, 24, 22, 22, 22, 22, 22, 22, 22, 20, + 20, 20, 20, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 4, 4, + 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 20, 20, 20, 20, + 20, 20, 25, 25, 24, 22, 22, 22, 22, 22, 22, 22, 20, 20, 20, 20, + 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 12, 20, 20, 25, 25, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24, 20, 20, 20, + 11, 11, 11, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 20, 20, 25, 25, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 24, 20, 20, 20, 11, 11, 11, + 4, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, + 11, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 25, 20, 20, 20, 12, 12, 12, 15, 15, 15, + 15, 15, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 25, 20, 20, 20, 12, 12, 12, 15, 15, 15, 15, 15, 11, + 11, 11, 11, 11, 4, 4, 4, 20, 20, 20, 20, 22, 22, 22, 22, 22, + 22, 22, 22, 24, 24, 20, 20, 20, 20, 20, 20, 20, 22, 22, 22, 22, + 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 15, 15, 11, 11, 11, 11, + 11, 4, 4, 4, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 22, + 24, 24, 20, 20, 20, 20, 20, 20, 20, 22, 22, 22, 22, 25, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 15, 15, 11, 11, 11, 11, 11, 4, 20, + 20, 25, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 25, 21, 21, 20, 25, 23, 23, 20, 22, 22, 22, 22, 22, + 22, 22, 20, 20, 20, 20, 12, 12, 12, 12, 12, 15, 20, 20, 24, 25, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 21, 23, 23, 20, 25, 21, 21, 20, 22, 22, 22, 22, 22, 22, 22, 20, + 20, 20, 20, 12, 12, 12, 12, 12, 15, 20, 20, 24, 25, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 20, 25, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 20, 20, + 12, 12, 12, 12, 12, 15, 20, 20, 24, 25, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 20, 25, 21, + 21, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 24, 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 21, 23, 23, 20, 20, 20, 20, 22, 22, + 22, 22, 22, 22, 23, 21, 21, 24, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 25, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 25, 21, 21, 20, 20, 20, 20, 22, 22, 22, 22, 22, + 22, 21, 23, 23, 25, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 20, + 20, 25, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 25, 21, 21, 21, 22, 22, 22, 20, 20, 20, 20, 21, 21, 21, 23, + 20, 20, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 20, 20, 25, 24, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 25, 21, + 21, 21, 22, 22, 22, 20, 20, 20, 20, 21, 21, 21, 23, 20, 20, 20, + 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 22, 25, 24, 24, 24, 25, + 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 25, 21, 21, 22, 22, + 22, 22, 22, 20, 20, 20, 20, 20, 20, 20, 20, 20, 4, 4, 20, 20, + 22, 22, 22, 22, 22, 22, 22, 22, 25, 23, 24, 24, 25, 25, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 25, 21, 21, 22, 22, 22, 22, 22, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 4, 4, 20, 20, 21, 21, 22, + 22, 22, 22, 22, 22, 22, 22, 21, 25, 24, 24, 24, 24, 25, 25, 25, + 25, 24, 24, 24, 24, 24, 23, 23, 23, 23, 21, 21, 21, 20, 20, 20, + 4, 4, 4, 11, 11, 11, 11, 11, 20, 20, 21, 21, 22, 22, 22, 22, + 22, 22, 22, 22, 21, 21, 24, 24, 24, 24, 25, 25, 25, 25, 24, 24, + 24, 24, 24, 25, 23, 23, 23, 21, 21, 21, 20, 20, 20, 4, 4, 4, + 11, 11, 11, 11, 11, 20, 20, 21, 21, 21, 23, 23, 23, 23, 21, 21, + 21, 21, 21, 23, 24, 24, 24, 25, 25, 25, 25, 24, 24, 24, 24, 24, + 25, 25, 23, 23, 21, 21, 20, 20, 20, 20, 4, 4, 4, 11, 11, 11, + 11, 11, 20, 20, 21, 21, 21, 23, 23, 23, 23, 21, 21, 21, 21, 21, + 23, 23, 24, 24, 25, 25, 25, 25, 24, 24, 24, 24, 24, 25, 25, 25, + 23, 21, 21, 20, 20, 20, 20, 4, 4, 4, 11, 11, 11, 11, 11, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 4, 4, 4, + 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, + 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4 +}; +// 'drizzleNight', 45x32px +const uint16_t drizzleNight [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 33, 33, 33, 36, + 36, 36, 36, 36, 33, 33, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 12, 35, 33, 33, 36, 36, 36, 36, + 36, 33, 33, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 15, + 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 15, 15, 15, 15, 34, 35, 35, 35, 37, 38, 38, 38, 38, 38, 37, 37, + 33, 33, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 15, 15, 15, 15, + 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, + 15, 34, 35, 35, 35, 37, 38, 38, 38, 38, 38, 37, 37, 33, 33, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, + 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 33, 33, 33, 35, + 37, 37, 37, 38, 38, 36, 36, 36, 33, 33, 33, 33, 36, 36, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 12, 36, 36, 38, 37, 37, 37, 37, + 38, 38, 33, 33, 15, 12, 12, 12, 12, 33, 33, 15, 15, 15, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 36, 36, 38, 37, 37, 37, 37, 38, 34, 34, + 33, 15, 12, 12, 12, 12, 33, 33, 15, 15, 15, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 20, 20, 20, 20, 20, + 20, 20, 20, 36, 36, 38, 37, 37, 37, 37, 38, 34, 15, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 20, 20, 20, 20, 20, 20, 20, 20, + 36, 36, 38, 37, 37, 37, 37, 38, 34, 15, 15, 15, 12, 12, 12, 12, + 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 29, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 24, 20, 20, 20, + 20, 20, 20, 38, 37, 35, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 29, 20, + 20, 20, 22, 22, 22, 22, 22, 22, 22, 24, 20, 20, 20, 20, 20, 20, + 38, 37, 35, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 20, 25, 24, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 25, 25, 20, 20, 35, + 35, 35, 12, 15, 15, 15, 15, 36, 36, 12, 12, 12, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 20, 25, 24, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 20, 20, 37, 35, 35, 35, + 34, 34, 34, 34, 35, 36, 12, 12, 12, 12, 12, 12, 12, 12, 15, 15, + 15, 15, 12, 12, 20, 25, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 20, 20, 37, 35, 35, 35, 34, 34, 34, + 34, 35, 35, 12, 12, 12, 15, 15, 15, 15, 15, 29, 20, 20, 20, 20, + 20, 20, 25, 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 24, 24, 20, 20, 20, 38, 38, 38, 37, 37, 33, 35, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 29, 20, 20, 20, 20, 20, 20, 25, + 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24, + 24, 20, 20, 20, 38, 38, 38, 37, 37, 33, 35, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 20, 20, 20, 22, 22, 22, 22, 22, 20, 20, 24, 24, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 25, + 22, 20, 20, 20, 20, 33, 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 20, 20, 20, 22, 22, 22, 22, 22, 20, 20, 24, 24, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 24, 24, 24, 25, 22, 20, 20, + 20, 20, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 20, 25, + 25, 22, 22, 22, 22, 22, 22, 22, 25, 25, 25, 25, 24, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 25, 25, 22, 22, 22, 22, 22, 20, 20, 4, + 4, 4, 11, 11, 11, 11, 11, 15, 15, 15, 15, 20, 25, 25, 25, 25, + 22, 22, 22, 22, 22, 22, 22, 25, 25, 24, 24, 24, 24, 25, 25, 25, + 21, 21, 23, 25, 25, 25, 24, 24, 24, 24, 20, 20, 4, 4, 4, 11, + 11, 11, 11, 11, 15, 15, 15, 15, 20, 25, 25, 25, 25, 22, 22, 22, + 22, 22, 22, 22, 25, 25, 24, 24, 24, 24, 25, 25, 25, 25, 21, 23, + 23, 25, 25, 24, 24, 24, 24, 20, 20, 4, 4, 4, 11, 11, 11, 11, + 11, 15, 15, 15, 15, 20, 20, 20, 25, 25, 24, 24, 24, 24, 24, 25, + 25, 25, 25, 24, 24, 24, 24, 25, 25, 25, 25, 25, 23, 23, 23, 25, + 24, 24, 20, 20, 20, 20, 4, 4, 4, 11, 11, 11, 11, 11, 15, 15, + 15, 15, 20, 20, 20, 25, 25, 24, 24, 24, 24, 24, 25, 25, 25, 25, + 24, 24, 24, 24, 25, 25, 25, 25, 25, 24, 23, 23, 23, 21, 24, 20, + 20, 20, 20, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 4, 4, 4, 11, 11, 11, 11, + 4, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, + 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, + 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 11, 11, 11, 11, 20, 20, 15, 15, 15, + 12, 12, 20, 12, 15, 15, 15, 15, 12, 20, 12, 12, 12, 15, 15, 15, + 20, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, + 15, 15, 15, 15, 12, 12, 12, 12, 20, 20, 4, 4, 4, 11, 11, 20, + 11, 4, 4, 4, 4, 11, 20, 11, 11, 11, 4, 4, 4, 20, 11, 11, + 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 20, 20, 4, 20, 20, 15, 15, 20, 11, 4, 20, + 20, 12, 15, 20, 11, 11, 20, 20, 12, 12, 20, 11, 11, 11, 11, 11, + 4, 4, 4, 4, 11, 11, 11, 11, 11, 15, 15, 15, 15, 15, 12, 12, + 12, 12, 20, 20, 4, 20, 20, 15, 15, 20, 11, 4, 20, 20, 12, 15, + 20, 11, 11, 20, 20, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 20, 20, 15, 15, 15, 15, 12, 20, 20, 12, 15, 15, 15, 15, + 20, 20, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 15, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4 +}; +// 'snowDay', 45x32px +const uint16_t snowDay [] PROGMEM = { + 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 18, 18, 18, 18, 17, 17, 17, 17, 17, 11, 11, 11, 11, 4, + 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 15, 15, 15, + 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 17, + 18, 18, 18, 17, 17, 17, 17, 17, 11, 11, 11, 11, 4, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 18, 18, 18, 18, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 17, 18, 18, 18, 17, 17, 17, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 4, 15, 15, 15, 15, 15, 12, 12, 12, 12, + 15, 15, 15, 15, 15, 18, 18, 18, 18, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 17, 18, 18, 18, 17, 17, 17, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 17, + 17, 17, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 0, 0, 17, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 18, 18, 18, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 0, 18, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 12, 18, 18, 18, 0, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 18, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 18, 18, 18, 0, 0, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 18, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 4, 17, 17, + 17, 18, 18, 18, 18, 18, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 18, 18, 17, 15, 15, 15, + 12, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 18, 18, 18, 17, 17, + 17, 17, 17, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 17, 17, 18, 11, 11, 11, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 17, 18, 18, 18, 10, 10, 10, 10, 10, 10, + 17, 17, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 10, 10, 17, 18, 18, 17, 15, 15, 15, 15, 4, + 4, 4, 4, 17, 18, 18, 18, 10, 10, 10, 10, 10, 10, 17, 17, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 0, 10, 10, 17, 18, 18, 17, 15, 15, 15, 15, 4, 4, 4, 4, + 17, 18, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, + 10, 10, 10, 17, 17, 15, 15, 15, 15, 4, 4, 4, 4, 17, 18, 0, + 0, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, + 17, 17, 15, 15, 15, 15, 12, 12, 12, 12, 18, 17, 0, 0, 0, 0, + 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 11, + 11, 11, 11, 12, 12, 12, 12, 18, 17, 0, 0, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 18, 11, 11, 11, 11, + 12, 12, 12, 12, 18, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 17, 18, 18, 17, 11, 11, 11, 11, 4, 4, 4, + 4, 18, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 17, 18, 18, 17, 15, 15, 15, 15, 11, 11, 11, 11, 11, 4, + 18, 18, 18, 17, 17, 17, 17, 17, 18, 18, 18, 18, 17, 17, 17, 17, + 18, 18, 18, 18, 18, 17, 17, 17, 17, 18, 18, 18, 18, 18, 17, 15, + 15, 15, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 4, 17, 18, 18, + 17, 17, 17, 17, 17, 18, 18, 18, 18, 17, 17, 17, 17, 18, 18, 18, + 18, 18, 17, 17, 17, 17, 18, 18, 18, 18, 18, 17, 15, 15, 15, 12, + 12, 12, 12, 12, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 11, 11, 11, 0, 0, 4, 4, 4, 4, 11, 11, 0, 0, + 15, 15, 15, 15, 12, 12, 0, 11, 11, 4, 4, 4, 4, 11, 0, 0, + 12, 12, 15, 15, 15, 0, 0, 4, 4, 4, 4, 11, 11, 11, 11, 11, + 4, 4, 4, 0, 0, 11, 11, 11, 11, 4, 4, 0, 0, 11, 11, 11, + 11, 4, 4, 0, 15, 15, 12, 12, 12, 12, 15, 0, 0, 4, 4, 11, + 11, 11, 0, 0, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, + 11, 4, 4, 4, 0, 0, 15, 15, 15, 15, 12, 12, 0, 11, 4, 4, + 4, 4, 4, 11, 0, 0, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 0, 0, 15, 15, 15, 15, 12, 12, 0, 11, 4, 4, 4, 4, 4, + 11, 0, 0, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 0, 0, 11, 11, 11, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, + 4, 4, 0, 0, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, + 12, 15, 0, 0, 4, 11, 11, 11, 11, 11, 4, 4, 0, 0, 11, 11, + 11, 11, 4, 4, 0, 15, 15, 12, 12, 12, 12, 15, 0, 0, 4, 4, + 11, 11, 11, 0, 0, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, 0, + 0, 4, 11, 11, 11, 11, 11, 4, 4, 0, 0, 11, 11, 11, 11, 4, + 4, 0, 15, 15, 12, 12, 12, 12, 15, 0, 0, 4, 4, 11, 11, 11, + 0, 0, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 0, 0, 15, 15, 15, 15, 12, 12, 0, 11, 4, 4, 4, 4, + 4, 11, 0, 0, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 0, + 0, 15, 15, 15, 15, 12, 12, 0, 11, 4, 4, 4, 4, 4, 11, 0, + 0, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15 +}; +// 'rainNight', 45x32px +const uint16_t rainNight [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 29, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 4, 4, 4, 4, 4, 11, + 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 29, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, + 15, 15, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 15, 15, 15, 15, + 12, 12, 12, 12, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 21, 23, 20, 20, 20, 20, 20, 20, 20, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 4, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, + 12, 20, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 23, + 20, 20, 20, 20, 20, 20, 20, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 4, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 20, 20, 25, 24, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 25, 25, 20, 20, 12, 12, 12, 15, 15, 15, 15, 15, 11, 11, + 11, 11, 11, 4, 4, 4, 4, 11, 11, 20, 20, 25, 24, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 25, + 25, 20, 20, 12, 12, 12, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, + 4, 4, 4, 4, 11, 11, 20, 20, 25, 24, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 20, 20, + 12, 12, 12, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 11, 11, 20, 20, 25, 24, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 20, 20, 12, 12, 12, + 15, 15, 15, 15, 15, 12, 12, 12, 12, 20, 29, 29, 29, 29, 20, 20, + 20, 20, 24, 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 20, 20, 11, 11, 11, 4, 4, 4, + 4, 4, 12, 12, 12, 12, 20, 20, 20, 20, 20, 20, 20, 20, 20, 24, + 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 21, 21, 20, 20, 20, 20, 11, 4, 4, 4, 4, 4, 12, + 12, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 24, 25, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 21, 21, 20, 20, 20, 20, 11, 4, 4, 4, 4, 4, 12, 12, 20, 20, + 20, 20, 20, 22, 22, 22, 22, 22, 22, 20, 20, 25, 23, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, + 23, 22, 22, 20, 20, 20, 20, 4, 4, 12, 12, 20, 20, 20, 20, 20, + 22, 22, 22, 22, 22, 22, 20, 20, 25, 23, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 21, 21, 23, 22, 22, + 20, 20, 20, 20, 4, 4, 11, 11, 29, 20, 25, 24, 24, 22, 22, 22, + 22, 22, 22, 22, 22, 21, 21, 21, 23, 23, 23, 23, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 23, 23, 22, 22, 22, 22, 22, 22, 20, + 20, 15, 15, 11, 11, 29, 20, 25, 24, 24, 22, 22, 22, 22, 22, 22, + 22, 22, 21, 21, 21, 23, 23, 23, 23, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 23, 23, 22, 22, 22, 22, 22, 22, 20, 20, 15, 15, + 11, 11, 29, 20, 25, 24, 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, + 22, 21, 23, 23, 23, 23, 21, 21, 21, 21, 21, 23, 23, 24, 24, 25, + 25, 25, 23, 23, 21, 21, 21, 21, 23, 20, 20, 15, 15, 11, 11, 29, + 20, 25, 24, 24, 24, 24, 22, 22, 22, 22, 22, 22, 22, 22, 21, 23, + 23, 23, 23, 21, 21, 21, 21, 21, 23, 23, 23, 24, 25, 25, 25, 25, + 23, 21, 21, 21, 21, 23, 20, 20, 15, 15, 12, 12, 20, 20, 20, 20, + 20, 25, 25, 24, 24, 24, 24, 24, 25, 25, 25, 25, 21, 21, 21, 21, + 23, 23, 23, 23, 23, 21, 21, 21, 25, 24, 24, 24, 24, 21, 23, 23, + 23, 20, 20, 20, 20, 4, 4, 12, 12, 20, 20, 20, 20, 20, 25, 25, + 24, 24, 24, 24, 24, 25, 25, 25, 25, 24, 21, 21, 21, 23, 23, 23, + 23, 23, 21, 21, 21, 21, 23, 24, 24, 24, 24, 25, 23, 23, 20, 20, + 20, 20, 4, 4, 11, 11, 11, 11, 29, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 12, 15, 15, 15, 15, + 15, 11, 11, 11, 11, 29, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 12, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 21, 23, 4, 4, 4, 20, 20, 11, 11, 20, 20, 4, 4, 25, + 21, 21, 11, 11, 20, 20, 11, 11, 24, 25, 12, 12, 20, 20, 11, 11, + 21, 24, 25, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 23, + 21, 31, 11, 11, 20, 20, 12, 12, 20, 20, 15, 15, 21, 23, 23, 4, + 4, 20, 20, 12, 12, 25, 24, 15, 15, 20, 20, 12, 12, 25, 25, 24, + 15, 15, 15, 12, 12, 12, 12, 12, 12, 12, 25, 25, 12, 0x0801, 15, 29, + 29, 4, 4, 20, 20, 4, 11, 21, 21, 15, 12, 12, 20, 20, 11, 11, + 25, 25, 32, 11, 20, 20, 15, 12, 25, 25, 4, 32, 11, 20, 20, 15, + 12, 12, 12, 12, 12, 4, 4, 25, 25, 12, 15, 15, 20, 20, 12, 12, + 20, 20, 12, 15, 21, 24, 15, 12, 12, 20, 20, 11, 11, 24, 23, 4, + 11, 20, 20, 15, 12, 25, 23, 4, 4, 11, 20, 20, 15, 12, 12, 12, + 12, 12, 4, 4, 32, 32, 20, 20, 20, 15, 15, 20, 20, 4, 4, 25, + 21, 15, 15, 20, 29, 29, 12, 12, 21, 21, 15, 15, 20, 29, 12, 12, + 25, 25, 4, 4, 20, 20, 29, 11, 11, 11, 4, 4, 4, 4, 4, 15, + 15, 15, 15, 20, 20, 20, 4, 4, 20, 20, 11, 11, 24, 25, 31, 12, + 29, 20, 20, 15, 15, 25, 25, 12, 12, 20, 20, 15, 15, 24, 25, 31, + 11, 29, 20, 20, 4, 4, 4, 11, 11, 11, 11, 11, 15, 15, 15, 15, + 20, 20, 20, 4, 4, 20, 20, 11, 11, 24, 25, 31, 12, 29, 20, 20, + 15, 15, 25, 25, 12, 12, 20, 20, 15, 15, 24, 25, 31, 12, 29, 20, + 20, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 20, 20, 11, 4, 4, + 20, 20, 11, 11, 24, 24, 15, 12, 29, 20, 12, 15, 15, 24, 24, 12, + 12, 20, 20, 12, 15, 24, 24, 15, 12, 29, 20, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 12, 4, 4, 20, 20, 11, 4, 4, 20, 20, 11, + 11, 24, 24, 15, 12, 29, 20, 12, 15, 15, 24, 24, 12, 12, 20, 20, + 12, 15, 24, 24, 15, 12, 29, 20, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 12, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11 +}; +// 'thunderDay', 45x32px +const uint16_t thunderDay [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, + 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 17, + 17, 17, 17, 18, 18, 18, 18, 18, 17, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, + 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 18, 17, 17, 17, + 18, 18, 18, 18, 18, 17, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 4, 4, 4, 4, + 11, 11, 11, 11, 18, 17, 17, 17, 17, 10, 10, 10, 10, 10, 10, 10, + 10, 0, 0, 17, 17, 17, 18, 18, 18, 18, 12, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, + 11, 18, 17, 17, 17, 17, 10, 10, 10, 10, 10, 10, 10, 10, 0, 0, + 17, 17, 17, 18, 18, 18, 18, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 17, 17, 19, 0, + 0, 10, 10, 10, 10, 10, 10, 26, 26, 26, 26, 28, 27, 27, 27, 10, + 10, 10, 0, 0, 17, 18, 11, 11, 11, 4, 4, 4, 4, 4, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 15, 15, 17, 17, 0, 0, 0, 10, 10, + 10, 10, 10, 10, 28, 28, 28, 28, 28, 27, 27, 27, 10, 10, 10, 0, + 0, 17, 18, 11, 11, 11, 4, 4, 4, 4, 4, 15, 15, 15, 15, 15, + 12, 12, 12, 12, 15, 15, 17, 17, 0, 0, 0, 10, 10, 10, 10, 10, + 10, 28, 28, 28, 28, 28, 27, 27, 27, 10, 10, 10, 10, 10, 17, 18, + 11, 11, 11, 4, 4, 4, 4, 4, 15, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 17, 17, 0, 0, 0, 10, 10, 10, 10, 10, 10, 28, 28, + 28, 28, 28, 27, 10, 10, 10, 10, 10, 10, 10, 17, 18, 11, 11, 11, + 4, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, + 18, 18, 0, 0, 0, 10, 10, 10, 10, 10, 10, 27, 27, 27, 27, 27, + 28, 10, 10, 10, 10, 10, 10, 10, 18, 17, 15, 15, 15, 12, 12, 12, + 12, 12, 11, 11, 11, 11, 11, 17, 17, 17, 17, 18, 18, 18, 18, 0, + 0, 0, 10, 10, 10, 10, 27, 27, 28, 27, 27, 27, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 18, 17, 17, 17, 15, 12, 12, 12, 12, 12, 11, + 11, 11, 11, 11, 17, 17, 17, 17, 18, 18, 18, 18, 0, 0, 0, 10, + 10, 10, 10, 27, 27, 28, 28, 27, 27, 10, 10, 10, 10, 10, 10, 10, + 0, 0, 18, 17, 17, 17, 15, 12, 12, 12, 12, 12, 11, 11, 11, 18, + 18, 17, 17, 10, 10, 10, 10, 10, 10, 17, 17, 17, 0, 0, 10, 10, + 27, 27, 28, 28, 28, 27, 27, 28, 28, 28, 10, 10, 10, 0, 0, 0, + 0, 10, 10, 17, 18, 18, 18, 12, 12, 11, 11, 11, 18, 18, 17, 17, + 10, 10, 10, 10, 10, 10, 17, 17, 17, 0, 0, 10, 10, 27, 27, 28, + 28, 28, 28, 27, 28, 28, 28, 10, 10, 10, 0, 0, 0, 0, 10, 10, + 17, 18, 18, 18, 12, 12, 15, 15, 15, 17, 17, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 0, 0, 27, 27, 28, 28, 27, 27, 27, 27, + 26, 27, 27, 27, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 17, + 17, 4, 4, 15, 15, 15, 17, 17, 0, 0, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 0, 0, 27, 27, 27, 28, 27, 27, 27, 27, 27, 28, 27, + 27, 10, 10, 10, 0, 0, 10, 10, 10, 10, 10, 10, 17, 17, 4, 4, + 15, 15, 15, 17, 17, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 27, 27, 27, 27, 27, 28, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 4, 4, 15, 15, 15, + 17, 17, 0, 0, 0, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 0, + 0, 0, 0, 27, 27, 27, 27, 27, 28, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 17, 17, 4, 4, 11, 11, 11, 18, 18, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 17, 17, 17, 18, 12, 12, 11, 11, 11, 18, 18, 17, 17, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 28, 28, + 28, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18, 17, + 17, 17, 12, 12, 15, 15, 15, 18, 18, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 26, 26, 28, 28, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 11, 4, 4, 4, 4, + 4, 15, 15, 15, 15, 15, 18, 17, 17, 17, 18, 18, 18, 18, 18, 17, + 17, 17, 17, 18, 18, 27, 26, 30, 28, 17, 17, 17, 18, 18, 18, 18, + 17, 17, 17, 17, 17, 18, 18, 18, 11, 4, 4, 4, 4, 4, 15, 15, + 15, 15, 0, 0, 0, 4, 4, 18, 18, 12, 12, 18, 17, 15, 15, 15, + 0, 0, 27, 27, 0x2a0b, 0x2a0b, 11, 11, 0, 0, 12, 12, 18, 17, 15, 15, + 0, 0, 0, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 0, + 0, 0, 12, 12, 17, 17, 4, 4, 17, 18, 11, 11, 11, 0, 0, 28, + 28, 18, 17, 15, 15, 0, 0, 4, 4, 17, 18, 11, 11, 0, 0, 0, + 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 0, 0, 0, 12, + 12, 17, 17, 4, 4, 17, 18, 11, 11, 11, 0, 0, 28, 28, 18, 18, + 11, 11, 0, 0, 4, 4, 17, 18, 11, 11, 0, 0, 0, 4, 4, 4, + 11, 11, 11, 11, 11, 12, 12, 0, 0, 11, 4, 4, 17, 18, 4, 4, + 17, 17, 4, 11, 11, 0, 0, 30, 30, 18, 17, 12, 12, 0, 0, 11, + 4, 17, 17, 4, 11, 0, 0, 11, 11, 4, 17, 17, 4, 11, 11, 11, + 11, 11, 12, 12, 0, 0, 11, 4, 4, 17, 17, 4, 4, 17, 17, 4, + 11, 11, 0, 0, 30, 30, 18, 18, 4, 4, 0, 0, 11, 4, 17, 17, + 4, 11, 0, 0, 11, 11, 4, 17, 17, 4, 11, 11, 11, 11, 11, 4, + 4, 4, 4, 4, 18, 18, 11, 11, 17, 18, 12, 12, 0, 0, 0, 12, + 12, 17, 17, 15, 15, 0, 0, 15, 15, 17, 18, 12, 12, 0, 0, 15, + 15, 17, 17, 18, 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, 4, 4, + 4, 18, 18, 11, 11, 17, 17, 12, 12, 0, 0, 0, 12, 12, 17, 17, + 15, 15, 0, 0, 15, 15, 17, 18, 12, 12, 0, 0, 15, 15, 17, 17, + 18, 12, 12, 12, 15, 15, 15, 15, 15, 4, 4, 4, 17, 17, 11, 11, + 18, 18, 4, 4, 0, 0, 15, 12, 12, 18, 18, 15, 15, 0, 0, 12, + 12, 17, 17, 15, 12, 0, 0, 12, 15, 17, 17, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 4, 4, 4, 17, 17, 11, 11, 18, 18, 4, + 4, 0, 0, 15, 12, 12, 18, 18, 15, 15, 0, 0, 12, 12, 18, 17, + 15, 12, 0, 0, 12, 15, 17, 17, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 15, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, + 4, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, + 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11 +}; +// 'fogNight', 45x32px +const uint16_t fogNight [] PROGMEM = { + 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, + 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 11, 11, 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, + 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 15, + 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 11, 11, 4, 4, 4, 4, 4, 11, 11, + 11, 11, 4, 4, 4, 4, 4, 12, 12, 12, 12, 12, 15, 15, 15, 15, + 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 11, 11, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 11, 11, 11, 11, 4, 4, 4, + 4, 4, 11, 11, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 22, 25, + 25, 20, 20, 20, 20, 20, 20, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, + 12, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 22, 21, 24, 20, 20, + 20, 20, 20, 20, 11, 4, 4, 4, 4, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 4, 4, 4, 4, 11, 11, 11, 11, 20, 20, 20, 24, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 25, + 25, 20, 20, 12, 12, 12, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, + 4, 4, 4, 4, 11, 11, 11, 11, 20, 20, 20, 24, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 25, 25, 20, 20, + 12, 12, 12, 15, 15, 15, 15, 15, 11, 11, 11, 11, 11, 4, 4, 4, + 4, 11, 11, 11, 11, 20, 20, 20, 24, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 20, 20, 12, 12, 12, + 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, + 12, 12, 20, 20, 20, 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 20, 20, 11, 11, 11, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 11, 11, 29, 20, 20, 20, 20, 20, 20, + 20, 20, 25, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 21, 24, 20, 20, 20, 20, 11, 4, 4, 4, 4, 4, 12, + 12, 12, 12, 12, 15, 15, 20, 20, 20, 20, 20, 20, 20, 20, 20, 25, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 21, 24, 20, 20, 20, 20, 11, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 29, 20, 20, 20, 22, 22, 22, 22, 22, 22, 22, 20, 25, 21, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 24, 24, + 25, 22, 22, 20, 20, 20, 20, 4, 4, 12, 12, 12, 12, 12, 20, 20, + 20, 20, 22, 22, 22, 22, 22, 22, 22, 20, 25, 21, 22, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 21, 24, 24, 25, 22, 22, + 20, 20, 20, 20, 4, 4, 11, 11, 11, 11, 11, 20, 20, 25, 24, 22, + 22, 22, 22, 22, 22, 22, 22, 21, 23, 23, 23, 23, 21, 22, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 25, 25, 22, 22, 22, 22, 22, 22, 20, + 20, 15, 15, 11, 11, 11, 11, 11, 20, 20, 25, 24, 22, 22, 22, 22, + 22, 22, 22, 22, 21, 23, 23, 23, 23, 21, 22, 22, 22, 22, 22, 22, + 22, 22, 22, 22, 25, 25, 22, 22, 22, 22, 22, 22, 20, 20, 15, 15, + 11, 11, 11, 11, 11, 20, 20, 25, 24, 25, 25, 22, 22, 22, 22, 22, + 22, 22, 22, 25, 23, 23, 21, 21, 21, 21, 21, 23, 23, 23, 24, 25, + 25, 25, 25, 25, 24, 24, 24, 24, 25, 20, 20, 15, 15, 11, 11, 11, + 11, 11, 20, 20, 25, 24, 25, 25, 22, 22, 22, 22, 22, 22, 22, 22, + 25, 23, 23, 21, 21, 21, 21, 21, 23, 23, 23, 23, 25, 25, 25, 25, + 25, 24, 24, 24, 24, 25, 20, 20, 15, 15, 12, 12, 12, 12, 12, 20, + 20, 20, 20, 21, 24, 24, 24, 24, 25, 25, 25, 25, 24, 24, 21, 21, + 23, 23, 23, 23, 23, 21, 21, 21, 21, 23, 24, 24, 24, 24, 25, 25, + 25, 20, 20, 20, 20, 4, 4, 12, 12, 12, 12, 12, 20, 20, 20, 20, + 25, 24, 24, 24, 24, 25, 25, 25, 25, 24, 24, 24, 21, 23, 23, 23, + 23, 23, 21, 21, 21, 21, 23, 23, 24, 24, 24, 25, 25, 25, 20, 20, + 20, 20, 4, 4, 21, 23, 23, 4, 4, 11, 11, 29, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 12, 15, 15, 15, 15, + 15, 21, 24, 23, 4, 4, 11, 11, 29, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 12, 15, 15, 15, 15, 15, 12, 12, + 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, + 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, + 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 25, 21, 21, 23, 23, 23, + 23, 21, 21, 21, 21, 21, 23, 23, 23, 12, 15, 15, 15, 21, 25, 25, + 25, 25, 25, 24, 24, 24, 24, 25, 25, 12, 12, 25, 21, 21, 21, 21, + 23, 23, 23, 23, 12, 12, 12, 25, 25, 21, 23, 23, 23, 23, 21, 21, + 21, 21, 21, 23, 23, 23, 12, 15, 15, 15, 21, 25, 25, 25, 25, 25, + 24, 24, 24, 24, 25, 25, 12, 12, 25, 21, 21, 21, 21, 23, 23, 23, + 23, 12, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, + 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, + 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, + 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 25, 24, 24, 24, 24, 25, 25, 25, 25, 24, 24, + 24, 24, 25, 25, 25, 31, 12, 15, 15, 21, 24, 25, 25, 25, 25, 25, + 24, 24, 24, 24, 25, 31, 12, 12, 12, 12, 12, 12, 12, 12, 15, 15, + 15, 15, 25, 23, 24, 24, 24, 25, 25, 25, 25, 24, 24, 24, 24, 25, + 25, 25, 31, 12, 15, 15, 21, 24, 25, 25, 25, 25, 25, 24, 24, 24, + 24, 25, 31, 12, 12, 12, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, + 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, + 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, + 15, 15, 15, 12, 12, 12, 12, 12, 15, 15, 15, 15, 12, 12, 12, 12, + 12, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15, 12, 12, + 12, 12, 15, 15, 15, 15, 15, 12, 12, 12, 12, 15, 15, 15, 15, 15 +}; + +// Array of all bitmaps for convenience. (Total bytes used to store images in PROGMEM = 26208) +const int allArray_LEN = 18; +const uint16_t* allArray[18] = { + sunnyDay, + clearNight, + partCloudDay, + partCloudNight, + cloudDay, + cloudNight, + vCloudDay, + vCloudNight, + drizzleDay, + drizzleNight, + rainDay, + rainNight, + thunderDay, + thunderNight, + snowDay, + snowNight, + fogDay, + fogNight +}; +const uint16_t* getIcon(String iconText) { + if (iconText == "01d") return sunnyDay; + if (iconText == "01n") return clearNight; + if (iconText == "02d") return partCloudDay; + if (iconText == "02n") return partCloudNight; + if (iconText == "03d") return cloudDay; + if (iconText == "03n") return cloudNight; + if (iconText == "04d") return vCloudDay; + if (iconText == "04n") return vCloudNight; + if (iconText == "09d") return drizzleDay; + if (iconText == "09n") return drizzleNight; + if (iconText == "10d") return rainDay; + if (iconText == "10n") return rainNight; + if (iconText == "11d") return thunderDay; + if (iconText == "11n") return thunderNight; + if (iconText == "13d") return snowDay; + if (iconText == "13n") return snowNight; + if (iconText == "50d") return fogDay; + if (iconText == "50n") return fogNight; + return nullptr; +}; diff --git a/PicoW_YBox3/ybox3.h b/PicoW_YBox3/ybox3.h new file mode 100644 index 000000000..aca036896 --- /dev/null +++ b/PicoW_YBox3/ybox3.h @@ -0,0 +1,3252 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT +// 'ybox3_bmp', 320x162px +const uint16_t myBitmapybox3_bmp [] PROGMEM = { + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, + 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 4, 4, 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 10, 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 4, 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 10, 10, 10, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, 5, 5, 5, 7, 4, 4, + 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, + 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 4, 4, + 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 4, 4, 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 4, 4, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 7, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, + 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, + 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 5, 5, 5, 5, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 5, 5, 5, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 5, 5, 5, 5, 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 5, 5, 5, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 5, 5, 5, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 5, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 7, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 5, 5, 5, 5, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 5, 5, 5, 5, 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 5, 5, 5, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, + 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 5, 5, 5, 5, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 7, 7, 7, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 5, 5, 5, 5, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 5, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 5, 5, 5, 5, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 5, 10, 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 5, 5, 5, 5, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 5, 5, 5, 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 5, 5, 5, 5, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, + 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, + 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, + 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, + 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 5, 5, 5, + 5, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, + 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, + 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 5, 5, 5, + 5, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, + 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, + 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, + 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, + 7, 7, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, + 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 7, + 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, + 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, + 7, 7, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, + 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 5, + 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, + 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, + 7, 7, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, + 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 5, + 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, + 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 7, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, 10, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 7, 10, 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 10, 10, 10, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 10, 10, 10, 10, 7, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 5, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 10, 10, 10, 10, 10, 10, 7, 7, + 7, 7, 5, 5, 5, 5, 5, 4, 4, 4, 4, 7, 7, 7, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, 7, 7, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 7, 7, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, + 7, 7, 5, 5, 5, 5, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, + 7, 7, 5, 5, 5, 5, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, + 7, 7, 5, 5, 5, 5, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 7, + 7, 7, 5, 5, 5, 5, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 7, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 7, 7, 7, 7, 7, 5, 5, 5, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 7, 7, 7, 7, 7, 5, 5, 5, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 7, 7, 7, 7, 7, 5, 5, 5, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 4, 4, 4, 4, 5, 5, 5, 5, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, 4, + 4, 4, 4, 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 7, 7, 7, 7, 7, 5, 5, 5, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 7, 4, 4, 4, 7, 7, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 4, 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 5, 5, 5, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, 5, + 5, 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 10, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 5, 5, 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 5, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 4, 4, 7, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 7, 4, 4, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 4, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 7, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 4, 4, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 4, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 4, 4, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4 +}; + +// Array of all bitmaps for convenience. (Total bytes used to store images in PROGMEM = 51856) +const int myBitmapallArray_LEN = 1; +const uint16_t* myBitmapallArray[1] = { + myBitmapybox3_bmp +}; diff --git a/Pico_DVI_Sock_Examples/Arduino_Pico_DVI_Sock/.pico_rp2040.test.only b/Pico_DVI_Sock_Examples/Arduino_Pico_DVI_Sock/.pico_rp2040.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Pico_DVI_Sock_Examples/Arduino_Pico_DVI_Sock/Arduino_Pico_DVI_Sock.ino b/Pico_DVI_Sock_Examples/Arduino_Pico_DVI_Sock/Arduino_Pico_DVI_Sock.ino new file mode 100644 index 000000000..56e7bf3ea --- /dev/null +++ b/Pico_DVI_Sock_Examples/Arduino_Pico_DVI_Sock/Arduino_Pico_DVI_Sock.ino @@ -0,0 +1,622 @@ +// SPDX-FileCopyrightText: 2023 Phil B. for Adafruit Industries +// SPDX-License-Identifier: MIT + +// Basic full-color PicoDVI test. Provides a 16-bit color video framebuffer to +// which Adafruit_GFX calls can be made. It's based on the EYESPI_Test.ino sketch. + +#include // Core display & graphics library +#include // A custom font + +// Here's how a 320x240 16-bit color framebuffer is declared. Double-buffering +// is not an option in 16-bit color mode, just not enough RAM; all drawing +// operations are shown as they occur. Second argument is a hardware +// configuration -- examples are written for Adafruit Feather RP2040 DVI, but +// that's easily switched out for boards like the Pimoroni Pico DV (use +// 'pimoroni_demo_hdmi_cfg') or Pico DVI Sock ('pico_sock_cfg'). +DVIGFX16 display(DVI_RES_320x240p60, pico_sock_cfg); + +// A 400x240 mode is possible but pushes overclocking even higher than +// 320x240 mode. SOME BOARDS MIGHT SIMPLY NOT BE COMPATIBLE WITH THIS. +// May require selecting QSPI div4 clock (Tools menu) to slow down flash +// accesses, may require further over-volting the CPU to 1.25 or 1.3 V. +//DVIGFX16 display(DVI_RES_400x240p60, adafruit_feather_dvi_cfg); + +void setup() { // Runs once on startup + if (!display.begin()) { // Blink LED if insufficient RAM + pinMode(LED_BUILTIN, OUTPUT); + for (;;) digitalWrite(LED_BUILTIN, (millis() / 500) & 1); + } +} + +#define PAUSE 2000 // Delay (milliseconds) between examples +uint8_t rotate = 0; // Current screen orientation (0-3) +#define CORNER_RADIUS 0 + +void loop() { + // Each of these functions demonstrates a different Adafruit_GFX concept: + show_shapes(); + show_charts(); + show_basic_text(); + show_char_map(); + show_custom_text(); + show_bitmap(); + show_canvas(); + + if (++rotate > 3) rotate = 0; // Cycle through screen rotations 0-3 + display.setRotation(rotate); // Takes effect on next drawing command +} + +// BASIC SHAPES EXAMPLE ---------------------------------------------------- + +void show_shapes() { + // Draw outlined and filled shapes. This demonstrates: + // - Enclosed shapes supported by GFX (points & lines are shown later). + // - Adapting to different-sized displays, and to rounded corners. + + const int16_t cx = display.width() / 2; // Center of screen = + const int16_t cy = display.height() / 2; // half of width, height + int16_t minor = min(cx, cy); // Lesser of half width or height + // Shapes will be drawn in a square region centered on the screen. But one + // particular screen -- rounded 240x280 ST7789 -- has VERY rounded corners + // that would clip a couple of shapes if drawn full size. If using that + // screen type, reduce area by a few pixels to avoid drawing in corners. + if (CORNER_RADIUS > 40) minor -= 4; + const uint8_t pad = 5; // Space between shapes is 2X this + const int16_t size = minor - pad; // Shapes are this width & height + const int16_t half = size / 2; // 1/2 of shape size + + display.fillScreen(0); // Start by clearing the screen; color 0 = black + + // Draw outline version of basic shapes: rectangle, triangle, circle and + // rounded rectangle in different colors. Rather than hardcoded numbers + // for position and size, some arithmetic helps adapt to screen dimensions. + display.drawRect(cx - minor, cy - minor, size, size, 0xF800); + display.drawTriangle(cx + pad, cy - pad, cx + pad + half, cy - minor, + cx + minor - 1, cy - pad, 0x07E0); + display.drawCircle(cx - pad - half, cy + pad + half, half, 0x001F); + display.drawRoundRect(cx + pad, cy + pad, size, size, size / 5, 0xFFE0); + delay(PAUSE); + + // Draw same shapes, same positions, but filled this time. + display.fillRect(cx - minor, cy - minor, size, size, 0xF800); + display.fillTriangle(cx + pad, cy - pad, cx + pad + half, cy - minor, + cx + minor - 1, cy - pad, 0x07E0); + display.fillCircle(cx - pad - half, cy + pad + half, half, 0x001F); + display.fillRoundRect(cx + pad, cy + pad, size, size, size / 5, 0xFFE0); + delay(PAUSE); +} // END SHAPE EXAMPLE + +// CHART EXAMPLES ---------------------------------------------------------- + +void show_charts() { + // Draw some graphs and charts. GFX library doesn't handle these as native + // object types, but it only takes a little code to build them from simple + // shapes. This demonstrates: + // - Drawing points and horizontal, vertical and arbitrary lines. + // - Adapting to different-sized displays. + // - Graphics being clipped off edge. + // - Use of negative values to draw shapes "backward" from an anchor point. + // - C technique for finding array size at runtime (vs hardcoding). + + display.fillScreen(0); // Clear screen + + const int16_t cx = display.width() / 2; // Center of screen = + const int16_t cy = display.height() / 2; // half of width, height + const int16_t minor = min(cx, cy); // Lesser of half width or height + const int16_t major = max(cx, cy); // Greater of half width or height + + // Let's start with a relatively simple sine wave graph with axes. + // Draw graph axes centered on screen. drawFastHLine() and drawFastVLine() + // need fewer arguments than normal 2-point line drawing shown later. + display.drawFastHLine(0, cy, display.width(), 0x0210); // Dark blue + display.drawFastVLine(cx, 0, display.height(), 0x0210); + + // Then draw some tick marks along the axes. To keep this code simple, + // these aren't to any particular scale, but a real program may want that. + // The loop here draws them from the center outward and pays no mind + // whether the screen is rectangular; any ticks that go off-screen will + // be clipped by the library. + for (uint8_t i=1; i<=10; i++) { + // The Arduino map() function scales an input value (e.g. "i") from an + // input range (0-10 here) to an output range (0 to major-1 here). + // Very handy for making graphics adjust to different screens! + int16_t n = map(i, 0, 10, 0, major - 1); // Tick offset relative to center point + display.drawFastVLine(cx - n, cy - 5, 11, 0x210); + display.drawFastVLine(cx + n, cy - 5, 11, 0x210); + display.drawFastHLine(cx - 5, cy - n, 11, 0x210); + display.drawFastHLine(cx - 5, cy + n, 11, 0x210); + } + + // Then draw sine wave over this using GFX drawPixel() function. + for (int16_t x=0; x(str.c_str())); +} + +// TEXT EXAMPLES ----------------------------------------------------------- + +// This section demonstrates: +// - Using the default 5x7 built-in font, including scaling in each axis. +// - How to access all characters of this font, including symbols. +// - Using a custom font, including alignment techniques that aren't a normal +// part of the GFX library (uses functions above). + +void show_basic_text() { + // Show text scaling with built-in font. + display.fillScreen(0); + display.setFont(); // Use default font + display.setCursor(0, CORNER_RADIUS); // Initial cursor position + display.setTextSize(1); // Default size + display.println(F("Standard built-in font")); + display.setTextSize(2); + display.println(F("BIG TEXT")); + display.setTextSize(3); + // "BIGGER TEXT" won't fit on narrow screens, so abbreviate there. + display.println((display.width() >= 200) ? F("BIGGER TEXT") : F("BIGGER")); + display.setTextSize(2, 4); + display.println(F("TALL and")); + display.setTextSize(4, 2); + display.println(F("WIDE")); + + delay(PAUSE); +} // END BASIC TEXT EXAMPLE + +void show_char_map() { + // "Code Page 437" is a name given to the original IBM PC character set. + // Despite age and limited language support, still seen in small embedded + // settings as it has some useful symbols and accented characters. The + // default 5x7 pixel font of Adafruit_GFX is modeled after CP437. This + // function draws a table of all the characters & explains some issues. + + // There are 256 characters in all. Draw table as 16 rows of 16 columns, + // plus hexadecimal row & column labels. How big can each cell be drawn? + const int cell_size = min(display.width(), display.height()) / 17; + if (cell_size < 8) return; // Screen is too small for table, skip example. + const int total_size = cell_size * 17; // 16 cells + 1 row or column label + + // Set up for default 5x7 font at 1:1 scale. Custom fonts are NOT used + // here as most are only 128 characters to save space (the "7b" at the + // end of many GFX font names means "7 bits," i.e. 128 characters). + display.setFont(); + display.setTextSize(1); + + // Early Adafruit_GFX was missing one symbol, throwing off some indices! + // But fixing the library would break MANY existing sketches that relied + // on the degrees symbol and others. The default behavior is thus "broken" + // to keep older code working. New code can access the CORRECT full CP437 + // table by calling this function like so: + display.cp437(true); + + display.fillScreen(0); + + const int16_t x = (display.width() - total_size) / 2; // Upper left corner of + int16_t y = (display.height() - total_size) / 2; // table centered on screen + if (y >= 4) { // If there's a little extra space above & below, scoot table + y += 4; // down a few pixels and show a message centered at top. + display.setCursor((display.width() - 114) / 2, 0); // 114 = pixel width + display.print(F("CP437 Character Map")); // of this message + } + + const int16_t inset_x = (cell_size - 5) / 2; // To center each character within cell, + const int16_t inset_y = (cell_size - 8) / 2; // compute X & Y offset from corner. + + for (uint8_t row=0; row<16; row++) { // 16 down... + // Draw row and columm headings as hexadecimal single digits. To get the + // hex value for a specific character, combine the left & top labels, + // e.g. Pi symbol is row E, column 3, thus: display.print((char)0xE3); + display.setCursor(x + (row + 1) * cell_size + inset_x, y + inset_y); + display.print(row, HEX); // This actually draws column labels + display.setCursor(x + inset_x, y + (row + 1) * cell_size + inset_y); + display.print(row, HEX); // and THIS is the row labels + for (uint8_t col=0; col<16; col++) { // 16 across... + if ((row + col) & 1) { // Fill alternating cells w/gray + display.fillRect(x + (col + 1) * cell_size, y + (row + 1) * cell_size, + cell_size, cell_size, 0x630C); + } + // drawChar() bypasses usual cursor positioning to go direct to an X/Y + // location. If foreground & background match, it's drawn transparent. + display.drawChar(x + (col + 1) * cell_size + inset_x, + y + (row + 1) * cell_size + inset_y, row * 16 + col, + 0xFFFF, 0xFFFF, 1); + } + } + + delay(PAUSE * 2); +} // END CHAR MAP EXAMPLE + +void show_custom_text() { + // Show use of custom fonts, plus how to do center or right alignment + // using some additional functions provided earlier. + + display.fillScreen(0); + display.setFont(&FreeSansBold18pt7b); + display.setTextSize(1); + display.setTextWrap(false); // Allow text off edges + + // Get "M height" of custom font and move initial base line there: + uint16_t w, h; + int16_t x, y; + display.getTextBounds("M", 0, 0, &x, &y, &w, &h); + // On rounded 240x280 display in tall orientation, "Custom Font" gets + // clipped by top corners. Scoot text down a few pixels in that one case. + if (CORNER_RADIUS && (display.height() == 280)) h += 20; + display.setCursor(display.width() / 2, h); + + if (display.width() >= 200) { + print_aligned(display, F("Custom Font"), GFX_ALIGN_CENTER); + display.setCursor(0, display.getCursorY() + 10); + print_aligned(display, F("Align Left"), GFX_ALIGN_LEFT); + display.setCursor(display.width() / 2, display.getCursorY()); + print_aligned(display, F("Centered"), GFX_ALIGN_CENTER); + // Small rounded screen, when oriented the wide way, "Right" gets + // clipped by bottom right corner. Scoot left to compensate. + int16_t x_offset = (CORNER_RADIUS && (display.height() < 200)) ? 15 : 0; + display.setCursor(display.width() - x_offset, display.getCursorY()); + print_aligned(display, F("Align Right"), GFX_ALIGN_RIGHT); + } else { + // On narrow screens, use abbreviated messages + print_aligned(display, F("Font &"), GFX_ALIGN_CENTER); + print_aligned(display, F("Align"), GFX_ALIGN_CENTER); + display.setCursor(0, display.getCursorY() + 10); + print_aligned(display, F("Left"), GFX_ALIGN_LEFT); + display.setCursor(display.width() / 2, display.getCursorY()); + print_aligned(display, F("Center"), GFX_ALIGN_CENTER); + display.setCursor(display.width(), display.getCursorY()); + print_aligned(display, F("Right"), GFX_ALIGN_RIGHT); + } + + delay(PAUSE); +} // END CUSTOM FONT EXAMPLE + +// BITMAP EXAMPLE ---------------------------------------------------------- + +// This section demonstrates: +// - Embedding a small bitmap in the code (flash memory). +// - Drawing that bitmap in various colors, and transparently (only '1' bits +// are drawn; '0' bits are skipped, leaving screen contents in place). +// - Use of the color565() function to decimate 24-bit RGB to 16 bits. + +#define HEX_WIDTH 16 // Bitmap width in pixels +#define HEX_HEIGHT 16 // Bitmap height in pixels +// Bitmap data. PROGMEM ensures it's in flash memory (not RAM). And while +// it would be valid to leave the brackets empty here (i.e. hex_bitmap[]), +// having dimensions with a little math makes the compiler verify the +// correct number of bytes are present in the list. +PROGMEM const uint8_t hex_bitmap[(HEX_WIDTH + 7) / 8 * HEX_HEIGHT] = { + 0b00000001, 0b10000000, + 0b00000111, 0b11100000, + 0b00011111, 0b11111000, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b01111111, 0b11111110, + 0b00011111, 0b11111000, + 0b00000111, 0b11100000, + 0b00000001, 0b10000000, +}; +#define Y_SPACING (HEX_HEIGHT - 2) // Used by code below for positioning + +void show_bitmap() { + display.fillScreen(0); + + // Not screen center, but UL coordinates of center hexagon bitmap + const int16_t center_x = (display.width() - HEX_WIDTH) / 2; + const int16_t center_y = (display.height() - HEX_HEIGHT) / 2; + const uint8_t steps = min((display.height() - HEX_HEIGHT) / Y_SPACING, + display.width() / HEX_WIDTH - 1) / 2; + + display.drawBitmap(center_x, center_y, hex_bitmap, HEX_WIDTH, HEX_HEIGHT, + 0xFFFF); // Draw center hexagon in white + + // Tile the hexagon bitmap repeatedly in a range of hues. Don't mind the + // bit of repetition in the math, the optimizer easily picks this up. + // Also, if math looks odd, keep in mind "PEMDAS" operator precedence; + // multiplication and division occur before addition and subtraction. + for (uint8_t a=0; a<=steps; a++) { + for (uint8_t b=1; b<=steps; b++) { + display.drawBitmap( // Right section centered red: a = green, b = blue + center_x + (a + b) * HEX_WIDTH / 2, + center_y + (a - b) * Y_SPACING, + hex_bitmap, HEX_WIDTH, HEX_HEIGHT, + display.color565(255, 255 - 255 * a / steps, 255 - 255 * b / steps)); + display.drawBitmap( // UL section centered green: a = blue, b = red + center_x - b * HEX_WIDTH + a * HEX_WIDTH / 2, + center_y - a * Y_SPACING, + hex_bitmap, HEX_WIDTH, HEX_HEIGHT, + display.color565(255 - 255 * b / steps, 255, 255 - 255 * a / steps)); + display.drawBitmap( // LL section centered blue: a = red, b = green + center_x - a * HEX_WIDTH + b * HEX_WIDTH / 2, + center_y + b * Y_SPACING, + hex_bitmap, HEX_WIDTH, HEX_HEIGHT, + display.color565(255 - 255 * a / steps, 255 - 255 * b / steps, 255)); + } + } + + delay(PAUSE); +} // END BITMAP EXAMPLE + +// CANVAS EXAMPLE ---------------------------------------------------------- + +// This section demonstrates: +// - How to refresh changing values onscreen without erase/redraw flicker. +// - Using an offscreen canvas. It's similar to a bitmap above, but rather +// than a fixed pattern in flash memory, it's drawable like the screen. +// - More tips on text alignment, and adapting to different screen sizes. + +#define PADDING 6 // Pixels between axis label and value + +void show_canvas() { + // For this example, let's suppose we want to display live readings from a + // sensor such as a three-axis accelerometer, something like: + // X: (number) + // Y: (number) + // Z: (number) + // To look extra classy, we want a custom font, and the labels for each + // axis are right-aligned so the ':' characters line up... + + display.setFont(&FreeSansBold18pt7b); // Use a custom font + display.setTextSize(1); // and reset to 1:1 scale + + char *label[] = { "X:", "Y:", "Z:" }; // Labels for each axis + const uint16_t color[] = { 0xF800, 0x07E0, 0x001F }; // Colors for each value + + // To get the labels right-aligned, one option would be simple trial and + // error to find a column that looks good and doesn't clip anything off. + // Let's do this dynamically though, so it adapts to any font or labels! + // Start by finding the widest of the label strings: + uint16_t w, h, max_w = 0; + int16_t x, y; + for (uint8_t i=0; i<3; i++) { // For each label... + display.getTextBounds(label[i], 0, 0, &x, &y, &w, &h); + if (w > max_w) max_w = w; // Keep track of widest label + } + + // Rounded corners throwing us a curve again. If needed, scoot everything + // to the right a bit on wide displays, down a bit on tall ones. + int16_t y_offset = 0; + if (display.width() > display.height()) max_w += CORNER_RADIUS; + else y_offset = CORNER_RADIUS; + + // Now we have max_w for right-aligning the labels. Before we draw them + // though...in order to perform flicker-free updates, the numbers we show + // will be rendered in either a GFXcanvas1 or GFXcanvas16 object; a 1-bit + // or 16-bit offscreen bitmap, RAM permitting. The correct size for this + // canvas could also be trial-and-errored, but again let's make this adapt + // automatically. The width of the canvas will span from max_w (plus a few + // pixels for padding) to the right edge. But the height? Looking at an + // uppercase 'M' can work in many situations, but some fonts have ascenders + // and descenders on digits, and in some locales a comma (extending below + // the baseline) is the decimal separator. Feed ALL the numeric chars into + // getTextBounds() for a cumulative height: + display.setTextWrap(false); // Keep on one line + display.getTextBounds(F("0123456789.,-"), 0, 0, &x, &y, &w, &h); + + // Now declare a GFXcanvas16 object based on the computed width & height: + GFXcanvas16 canvas16(display.width() - max_w - PADDING, h); + + // Small devices (e.g. ATmega328p) will almost certainly lack enough RAM + // for the canvas. Check if canvas buffer exists. If not, fall back on + // using a 1-bit (rather than 16-bit) canvas. Much more RAM friendly, but + // not as fast to draw. If a project doesn't require super interactive + // updates, consider just going straight for the more compact Canvas1. + if (canvas16.getBuffer()) { + // If here, 16-bit canvas allocated successfully! Point of interest, + // only one canvas is needed for this example, we can reuse it for all + // three numbers because the regions are the same size. + + // display and canvas are independent drawable objects; must explicitly + // set the same custom font to use on the canvas now: + canvas16.setFont(&FreeSansBold18pt7b); + + // Clear display and print labels. Once drawn, these remain untouched. + display.fillScreen(0); + display.setCursor(max_w, -y + y_offset); // Set baseline for first row + for (uint8_t i=0; i<3; i++) print_aligned(display, label[i], GFX_ALIGN_RIGHT); + + // Last part now is to print numbers on the canvas and copy the canvas to + // the display, repeating for several seconds... + uint32_t elapsed, startTime = millis(); + while ((elapsed = (millis() - startTime)) <= PAUSE * 2) { + for (uint8_t i=0; i<3; i++) { // For each label... + canvas16.fillScreen(0); // fillScreen() in this case clears canvas + canvas16.setCursor(0, -y); // Reset baseline for custom font + canvas16.setTextColor(color[i]); + // These aren't real accelerometer readings, just cool-looking numbers. + // Notice we print to the canvas, NOT the display: + canvas16.print(sin(elapsed / 200.0 + (float)i * M_PI * 2.0 / 3.0), 5); + // And HERE is the secret sauce to flicker-free updates. Canvas details + // can be passed to the drawRGBBitmap() function, which fully overwrites + // prior screen contents in that area. yAdvance is font line spacing. + display.drawRGBBitmap(max_w + PADDING, i * FreeSansBold18pt7b.yAdvance + + y_offset, canvas16.getBuffer(), canvas16.width(), + canvas16.height()); + } + } + } else { + // Insufficient RAM for Canvas16. Try declaring a 1-bit canvas instead... + GFXcanvas1 canvas1(display.width() - max_w - PADDING, h); + // If even this smaller object fails, can't proceed, cancel this example. + if (!canvas1.getBuffer()) return; + + // Remainder here is nearly identical to the code above, simply using a + // different canvas type. It's stripped of most comments for brevity. + canvas1.setFont(&FreeSansBold18pt7b); + display.fillScreen(0); + display.setCursor(max_w, -y + y_offset); + for (uint8_t i=0; i<3; i++) print_aligned(display, label[i], GFX_ALIGN_RIGHT); + uint32_t elapsed, startTime = millis(); + while ((elapsed = (millis() - startTime)) <= PAUSE * 2) { + for (uint8_t i=0; i<3; i++) { + canvas1.fillScreen(0); + canvas1.setCursor(0, -y); + canvas1.print(sin(elapsed / 200.0 + (float)i * M_PI * 2.0 / 3.0), 5); + // Here's the secret sauce to flicker-free updates with GFXcanvas1. + // Canvas details can be passed to the drawBitmap() function, and by + // specifying both a foreground AND BACKGROUND color (0), this will fully + // overwrite/erase prior screen contents in that area (vs transparent). + display.drawBitmap(max_w + PADDING, i * FreeSansBold18pt7b.yAdvance + + y_offset, canvas1.getBuffer(), canvas1.width(), + canvas1.height(), color[i], 0); + } + } + } + + // Because canvas object was declared locally to this function, it's freed + // automatically when the function returns; no explicit delete needed. +} // END CANVAS EXAMPLE diff --git a/Pico_DVI_Sock_Examples/Arduino_Pico_DVI_Sock/Arduino_Pico_DVI_Sock.uf2 b/Pico_DVI_Sock_Examples/Arduino_Pico_DVI_Sock/Arduino_Pico_DVI_Sock.uf2 new file mode 100644 index 000000000..a4dbc7d13 Binary files /dev/null and b/Pico_DVI_Sock_Examples/Arduino_Pico_DVI_Sock/Arduino_Pico_DVI_Sock.uf2 differ diff --git a/Pico_DVI_Sock_Examples/CircuitPython/Helvetica-Bold-16.pcf b/Pico_DVI_Sock_Examples/CircuitPython/Helvetica-Bold-16.pcf new file mode 100644 index 000000000..deb9092d1 Binary files /dev/null and b/Pico_DVI_Sock_Examples/CircuitPython/Helvetica-Bold-16.pcf differ diff --git a/Pico_DVI_Sock_Examples/CircuitPython/blinka_computer.bmp b/Pico_DVI_Sock_Examples/CircuitPython/blinka_computer.bmp new file mode 100644 index 000000000..a746387ba Binary files /dev/null and b/Pico_DVI_Sock_Examples/CircuitPython/blinka_computer.bmp differ diff --git a/Pico_DVI_Sock_Examples/CircuitPython/code.py b/Pico_DVI_Sock_Examples/CircuitPython/code.py new file mode 100644 index 000000000..6fdfa0b23 --- /dev/null +++ b/Pico_DVI_Sock_Examples/CircuitPython/code.py @@ -0,0 +1,323 @@ +# SPDX-FileCopyrightText: 2023 Liz Clark for Adafruit Industries +# SPDX-FileCopyrightText: Adapted from Phil B.'s 16bit_hello Arduino Code +# +# SPDX-License-Identifier: MIT + +import gc +import math +from random import randint +import time +import displayio +import picodvi +import board +import framebufferio +import vectorio +import terminalio +import simpleio +from adafruit_bitmap_font import bitmap_font +from adafruit_display_text import label, wrap_text_to_lines +from adafruit_display_shapes.rect import Rect +from adafruit_display_shapes.circle import Circle +from adafruit_display_shapes.roundrect import RoundRect +from adafruit_display_shapes.triangle import Triangle +from adafruit_display_shapes.line import Line + +# pin defs for DVI Sock +displayio.release_displays() +fb = picodvi.Framebuffer(320, 240, + clk_dp=board.GP14, clk_dn=board.GP15, + red_dp=board.GP12, red_dn=board.GP13, + green_dp=board.GP18, green_dn=board.GP19, + blue_dp=board.GP16, blue_dn=board.GP17, + color_depth=8) +display = framebufferio.FramebufferDisplay(fb) + +bitmap = displayio.Bitmap(display.width, display.height, 3) + +red = 0xff0000 +yellow = 0xcccc00 +orange = 0xff5500 +blue = 0x0000ff +pink = 0xff00ff +purple = 0x5500ff +white = 0xffffff +green = 0x00ff00 +aqua = 0x125690 + +palette = displayio.Palette(3) +palette[0] = 0x000000 # black +palette[1] = white +palette[2] = yellow + +palette.make_transparent(0) + +tile_grid = displayio.TileGrid(bitmap, pixel_shader=palette) + +group = displayio.Group() + +def clean_up(group_name): + for _ in range(len(group_name)): + group_name.pop() + gc.collect() + +def show_shapes(): + gc.collect() + cx = int(display.width / 2) + cy = int(display.height / 2) + minor = min(cx, cy) + pad = 5 + size = minor - pad + half = int(size / 2) + rect = Rect(cx - minor, cy - minor, size, size, stroke = 1, fill=red, outline = red) + tri = Triangle(cx + pad, cy - pad, cx + pad + half, cy - minor, + cx + minor - 1, cy - pad, fill=green, outline = green) + circ = Circle(cx - pad - half, cy + pad + half, half, fill=blue, stroke = 1, outline = blue) + rnd = RoundRect(cx + pad, cy + pad, size, size, int(size / 5), stroke = 1, + fill=yellow, outline = yellow) + + group.append(rect) + group.append(tri) + group.append(circ) + group.append(rnd) + rect.fill = None + tri.fill = None + circ.fill = None + rnd.fill = None + + time.sleep(2) + + rect.fill = red + tri.fill = green + circ.fill = blue + rnd.fill = yellow + time.sleep(2) + clean_up(group) + del rect + del tri + del circ + del rnd + gc.collect() + +def sine_chart(): + gc.collect() + cx = int(display.width / 2) + cy = int(display.height / 2) + minor = min(cx, cy) + major = max(cx, cy) + + group.append(Line(cx, 0, cx, display.height, blue)) # v + group.append(Line(0, cy, display.width, cy, blue)) # h + + for i in range(10): + _n = simpleio.map_range(i, 0, 10, 0, major - 1) + n = int(_n) + group.append(Line(cx - n, cy - 5, cx - n, (cy - 5) + 11, blue)) # v + group.append(Line(cx + n, cy - 5, cx + n, (cy - 5) + 11, blue)) # v + group.append(Line(cx - 5, cy - n, (cx - 5) + 11, cy - n, blue)) # h + group.append(Line(cx - 5, cy + n, (cx - 5) + 11, cy + n, blue)) # h + + for x in range(display.width): + y = cy - int(math.sin((x - cx) * 0.05) * float(minor * 0.5)) + bitmap[x, y] = 1 + group.append(tile_grid) + time.sleep(2) + clean_up(group) + +def widget0(): + gc.collect() + data = [31, 42, 36, 58, 67, 88] + num_points = len(data) + + text_area = label.Label(terminalio.FONT, text="Widget Sales", color=white) + text_area.anchor_point = (0.5, 0.0) + text_area.anchored_position = (display.width / 2, 3) + group.append(text_area) + for i in range(11): + _x = simpleio.map_range(i, 0, 10, 0, display.width - 1) + x = int(_x) + group.append(Line(x, 20, x, display.height, blue)) + _y = simpleio.map_range(i, 0, 10, 20, display.height - 1) + y = int(_y) + group.append(Line(0, y, display.width, y, blue)) + prev_x = 0 + _prev_y = simpleio.map_range(data[0], 0, 100, display.height - 1, 20) + prev_y = int(_prev_y) + for i in range(1, num_points): + _new_x = simpleio.map_range(i, 0, num_points - 1, 0, display.width - 1) + new_x = int(_new_x) + _new_y = simpleio.map_range(data[i], 0, 100, display.height - 1, 20) + new_y = int(_new_y) + group.append(Line(prev_x, prev_y, new_x, new_y, aqua)) + prev_x = new_x + prev_y = new_y + + for i in range(num_points): + _x = simpleio.map_range(i, 0, num_points - 1, 0, display.width - 1) + x = int(_x) + _y = simpleio.map_range(data[i], 0, 100, display.height - 1, 20) + y = int(_y) + group.append(Circle(x, y, 5, fill=None, stroke = 2, outline = white)) + + time.sleep(2) + clean_up(group) + +def widget1(): + gc.collect() + data = [31, 42, 36, 58, 67, 88] + num_points = len(data) + bar_width = int(display.width / num_points) - 4 + x_mapped_w = display.width + 2 + h_mapped_h = display.height + 20 + + text_area = label.Label(terminalio.FONT, text="Widget Sales", color=white) + text_area.anchor_point = (0.5, 0.0) + text_area.anchored_position = (display.width / 2, 3) + group.append(text_area) + for i in range(11): + _y = simpleio.map_range(i, 0, 10, 20, display.height - 1) + y = int(_y) + group.append(Line(0, y, display.width, y, blue)) + for i in range(num_points): + _x = simpleio.map_range(i, 0, num_points, 0, x_mapped_w) + x = int(_x) + _height = simpleio.map_range(data[i], 0, 100, h_mapped_h, 0) + height = int(_height) + group.append(vectorio.Rectangle(pixel_shader=palette, width=bar_width, + height=display.height + 1, x=x, y=height, color_index = 2)) + + time.sleep(2) + clean_up(group) + +def text_align(): + gc.collect() + TEXT = "hello world" + + text_area_top_left = label.Label(terminalio.FONT, text=TEXT, color=red) + text_area_top_left.anchor_point = (0.0, 0.0) + text_area_top_left.anchored_position = (0, 0) + + text_area_top_middle = label.Label(terminalio.FONT, text=TEXT, color=orange) + text_area_top_middle.anchor_point = (0.5, 0.0) + text_area_top_middle.anchored_position = (display.width / 2, 0) + + text_area_top_right = label.Label(terminalio.FONT, text=TEXT, color=yellow) + text_area_top_right.anchor_point = (1.0, 0.0) + text_area_top_right.anchored_position = (display.width, 0) + + text_area_middle_left = label.Label(terminalio.FONT, text=TEXT, color=green) + text_area_middle_left.anchor_point = (0.0, 0.5) + text_area_middle_left.anchored_position = (0, display.height / 2) + + text_area_middle_middle = label.Label(terminalio.FONT, text=TEXT, color=aqua) + text_area_middle_middle.anchor_point = (0.5, 0.5) + text_area_middle_middle.anchored_position = (display.width / 2, display.height / 2) + + text_area_middle_right = label.Label(terminalio.FONT, text=TEXT, color=blue) + text_area_middle_right.anchor_point = (1.0, 0.5) + text_area_middle_right.anchored_position = (display.width, display.height / 2) + + text_area_bottom_left = label.Label(terminalio.FONT, text=TEXT, color=purple) + text_area_bottom_left.anchor_point = (0.0, 1.0) + text_area_bottom_left.anchored_position = (0, display.height) + + text_area_bottom_middle = label.Label(terminalio.FONT, text=TEXT, color=pink) + text_area_bottom_middle.anchor_point = (0.5, 1.0) + text_area_bottom_middle.anchored_position = (display.width / 2, display.height) + + text_area_bottom_right = label.Label(terminalio.FONT, text=TEXT, color=white) + text_area_bottom_right.anchor_point = (1.0, 1.0) + text_area_bottom_right.anchored_position = (display.width, display.height) + + group.append(text_area_top_middle) + group.append(text_area_top_left) + group.append(text_area_top_right) + group.append(text_area_middle_middle) + group.append(text_area_middle_left) + group.append(text_area_middle_right) + group.append(text_area_bottom_middle) + group.append(text_area_bottom_left) + group.append(text_area_bottom_right) + + time.sleep(2) + clean_up(group) + +def custom_font(): + gc.collect() + my_font = bitmap_font.load_font("/Helvetica-Bold-16.pcf") + text_sample = "The quick brown fox jumps over the lazy dog." + text_sample = "\n".join(wrap_text_to_lines(text_sample, 28)) + text_area = label.Label(my_font, text="Custom Font", color=white) + text_area.anchor_point = (0.0, 0.0) + text_area.anchored_position = (0, 0) + + sample_text = label.Label(my_font, text=text_sample) + sample_text.anchor_point = (0.5, 0.5) + sample_text.anchored_position = (display.width / 2, display.height / 2) + + group.append(text_area) + group.append(sample_text) + + time.sleep(2) + clean_up(group) + + del my_font + gc.collect() + +def bitmap_example(): + gc.collect() + blinka_bitmap = displayio.OnDiskBitmap("/blinka_computer.bmp") + blinka_grid = displayio.TileGrid(blinka_bitmap, pixel_shader=blinka_bitmap.pixel_shader) + gc.collect() + group.append(blinka_grid) + + time.sleep(2) + clean_up(group) + + del blinka_grid + del blinka_bitmap + gc.collect() + +def sensor_values(): + gc.collect() + text_x = "X: %d" % randint(-25, 25) + text_y = "Y: %d" % randint(-25, 25) + text_z = "Z: %d" % randint(-25, 25) + x_text = label.Label(terminalio.FONT, text=text_x, color=red) + x_text.anchor_point = (0.0, 0.0) + x_text.anchored_position = (2, 0) + y_text = label.Label(terminalio.FONT, text=text_y, color=green) + y_text.anchor_point = (0.0, 0.0) + y_text.anchored_position = (2, 10) + z_text = label.Label(terminalio.FONT, text=text_z, color=blue) + z_text.anchor_point = (0.0, 0.0) + z_text.anchored_position = (2, 20) + group.append(x_text) + group.append(y_text) + group.append(z_text) + + for i in range(40): + if i == 10: + group.scale = 2 + elif i == 20: + group.scale = 3 + elif i == 30: + group.scale = 4 + x_text.text = "X: %d" % randint(-50, 50) + y_text.text = "Y: %d" % randint(-50, 50) + z_text.text = "Z: %d" % randint(-50, 50) + time.sleep(0.1) + time.sleep(0.1) + clean_up(group) + group.scale = 1 + +display.root_group = group + +while True: + show_shapes() + sine_chart() + widget0() + widget1() + text_align() + custom_font() + bitmap_example() + sensor_values() diff --git a/PlayStation_BLE/.itsybitsy_esp32.test.only b/PlayStation_BLE/.itsybitsy_esp32.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/PlayStation_BLE/PlayStation_ESP32_BLE_Gamepad.ino b/PlayStation_BLE/PlayStation_ESP32_BLE_Gamepad.ino new file mode 100644 index 000000000..57cba2a31 --- /dev/null +++ b/PlayStation_BLE/PlayStation_ESP32_BLE_Gamepad.ino @@ -0,0 +1,286 @@ +// SPDX-FileCopyrightText: 2024 John Park for Adafruit Industries +// +// SPDX-License-Identifier: MIT +/* + * Feather ESP32 Bluetooth LE gamepad https://github.com/lemmingDev/ESP32-BLE-Gamepad + * Deep sleep with wake on START button press + * https://randomnerdtutorials.com/esp32-deep-sleep-arduino-ide-wake-up-sources/ + + * OTA WiFi uploads + * https://docs.espressif.com/projects/arduino-esp32/en/latest/ota_web_update.html + * Sketch > Compile binary, then http://esp32.local/?userid=admin&pwd=admin + * pick compiled .bin, upload. + */ + +#include +#include +#include + +#include +#include +#include +#include +#include +#include + +bool web_ota = false; + +int sleepSeconds = 30; // how long is it inactive before going to sleep + +const char* host = "esp32"; +const char* ssid = "xxxxxxx"; // your WiFi SSID here +const char* password = "xxxxxxxx"; // your WiFi password here +WebServer server(80); + +/* + * Login page + */ + +const char* loginIndex = + "
" + "" + "" + "" + "
" + "
" + "" + "" + "" + "" + "" + "
" + "
" + "" + "" + "" + "
" + "
" + "" + "" + "" + "" + "
" + "
ESP32 Login Page
" + "
" + "
Username:
Password:
" +"
" +""; + +/* + * Server Index Page + */ + +const char* serverIndex = +"" +"
" + "" + "" + "
" + "
progress: 0%
" + ""; + +////////////////////////////////////// GAMEPAD +#define numOfButtons 12 +// sleep wake button definition (also update line in setup(): 'esp_sleep_enable_ext0_wakeup(GPIO_NUM_4,0);') +#define BUTTON_PIN_BITMASK 0x10 // start button on RTC GPIO pin 4 which is 0x10 (2^4 in hex) +// RTC_DATA_ATTR int bootCount = 0; + +BleGamepad bleGamepad("ItsyController", "Adafruit", 100); // name, manufacturer, batt level to start +byte previousButtonStates[numOfButtons]; +byte currentButtonStates[numOfButtons]; + +// ItsyBitsy EPS32: 13, 12, 14, 33, 32, 7, 5, 27, 15, 20, 8, 22, 21, 19, 36, 37, 38, 4, 26, 25 +// RTC IO: 13, 12, 14, 33, 32, 27, 15, 36, 37, 38, 4, 26, 25 +// pins that act funny: 5, 37, 22 +byte buttonPins[numOfButtons] = { 13, 12, 14, 33, 32, 7, 27, 15, 21, 19, 4, 26 }; // ItsyBitsy +byte physicalButtons[numOfButtons] = { 1, 2, 4, 5, 7, 8, 15, 16, 13, 14, 12, 11 }; // controller assignments +// b0, b1, b3, b4, b6, b7, b14, b15, b12, b13, b10, b11 +// gampad: O/b0, X/b1, ^/b3, []]/b4, l_trig/b6, r_trig/b7, up/b14 , down/b15 , left/b12 , right/b13, select/b11, start/b10 + +int last_button_press = millis(); +int sleepTime = (sleepSeconds * 1000); + +Adafruit_NeoPixel pixel(1, 0, NEO_GRB + NEO_KHZ800); // Itsy on-board NeoPixel + +void setup() +{ + Serial.begin(115200); + delay(500); + + //Print the wakeup reason for ESP32 + // print_wakeup_reason(); + esp_sleep_enable_ext0_wakeup(GPIO_NUM_4,0); //1 = High, 0 = Low + + for (byte currentPinIndex = 0; currentPinIndex < numOfButtons; currentPinIndex++) + { + pinMode(buttonPins[currentPinIndex], INPUT_PULLUP); + previousButtonStates[currentPinIndex] = HIGH; + currentButtonStates[currentPinIndex] = HIGH; + } + + bleGamepad.begin(); + delay(100); + pixel.begin(); + pixel.clear(); + + if (web_ota) { + + // Connect to WiFi network + WiFi.begin(ssid, password); + Serial.println(""); + + // Wait for connection for 20 seconds, then move on + unsigned long startTime = millis(); // Get the current time + while (!(WiFi.status() == WL_CONNECTED) && ((millis() - startTime) < 2000)) { + delay(500); + Serial.print("."); + } + + if (WiFi.status() == WL_CONNECTED) { + + Serial.println(""); + Serial.print("Connected to "); + Serial.println(ssid); + Serial.print("IP address: "); + Serial.println(WiFi.localIP()); + + /*use mdns for host name resolution*/ + if (!MDNS.begin(host)) { //http://esp32.local + Serial.println("Error setting up MDNS responder!"); + while (1) { + delay(1000); + } + } + Serial.println("mDNS responder started"); + /*return index page which is stored in serverIndex */ + server.on("/", HTTP_GET, []() { + server.sendHeader("Connection", "close"); + server.send(200, "text/html", loginIndex); + }); + server.on("/serverIndex", HTTP_GET, []() { + server.sendHeader("Connection", "close"); + server.send(200, "text/html", serverIndex); + }); + /*handling uploading firmware file */ + server.on("/update", HTTP_POST, []() { + server.sendHeader("Connection", "close"); + server.send(200, "text/plain", (Update.hasError()) ? "FAIL" : "OK"); + ESP.restart(); + }, []() { + HTTPUpload& upload = server.upload(); + if (upload.status == UPLOAD_FILE_START) { + Serial.printf("Update: %s\n", upload.filename.c_str()); + if (!Update.begin(UPDATE_SIZE_UNKNOWN)) { //start with max available size + Update.printError(Serial); + } + } else if (upload.status == UPLOAD_FILE_WRITE) { + /* flashing firmware to ESP*/ + if (Update.write(upload.buf, upload.currentSize) != upload.currentSize) { + Update.printError(Serial); + } + } else if (upload.status == UPLOAD_FILE_END) { + if (Update.end(true)) { //true to set the size to the current progress + Serial.printf("Update Success: %u\nRebooting...\n", upload.totalSize); + } else { + Update.printError(Serial); + } + } + }); + server.begin(); + } + else { + Serial.println(""); + Serial.println("WiFi connection timed out, you may need to update SSID/password. Moving on now."); + } + } +} + +void loop() +{ + if (web_ota) { + server.handleClient(); + delay(1); + } + + if (bleGamepad.isConnected()) + { + pixel.setPixelColor(0, 0x000033); + pixel.show(); + + for (byte currentIndex = 0; currentIndex < numOfButtons; currentIndex++) + { + currentButtonStates[currentIndex] = digitalRead(buttonPins[currentIndex]); + + if (currentButtonStates[currentIndex] != previousButtonStates[currentIndex]) + { + last_button_press = millis(); // update last_button_press for sleep timing + + if (currentButtonStates[currentIndex] == LOW) + { + bleGamepad.press(physicalButtons[currentIndex]); + } + else + { + bleGamepad.release(physicalButtons[currentIndex]); + } + } + } + + if (currentButtonStates != previousButtonStates) + { + for (byte currentIndex = 0; currentIndex < numOfButtons; currentIndex++) + { + previousButtonStates[currentIndex] = currentButtonStates[currentIndex]; + } + + bleGamepad.sendReport(); + } + if (millis() - last_button_press > sleepTime) { + server.stop(); + delay(300); + esp_wifi_stop(); + delay(300); + esp_deep_sleep_start(); + } + } +} diff --git a/Programmable_12v_Outdoor_Cafe_Lights/.qtpy_m0.test.only b/Programmable_12v_Outdoor_Cafe_Lights/.qtpy_m0.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Programmable_12v_Outdoor_Cafe_Lights/Programmable_12v_Outdoor_Cafe_Lights.ino b/Programmable_12v_Outdoor_Cafe_Lights/Programmable_12v_Outdoor_Cafe_Lights.ino new file mode 100644 index 000000000..24a46d888 --- /dev/null +++ b/Programmable_12v_Outdoor_Cafe_Lights/Programmable_12v_Outdoor_Cafe_Lights.ino @@ -0,0 +1,300 @@ +// SPDX-FileCopyrightText: 2024 Erin St Blaine for Adafruit Industries +// +// SPDX-License-Identifier: MIT +// +// Based on ColorWavesWithPalettes +// Animated shifting color waves, with several cross-fading color palettes. +// by Mark Kriegsman, August 2015 +// +// +// Color palettes courtesy of cpt-city and its contributors: +// http://soliton.vm.bytemark.co.uk/pub/cpt-city/ +// +// Color palettes converted for FastLED using "PaletteKnife" v1: +// http://fastled.io/tools/paletteknife/ +// +#include "FastLED.h" + +#define DATA_PIN SCL +#define LED_TYPE WS2812 +#define COLOR_ORDER RBG // If colors are coming out wrong, re-order (RGB, BRG, etc) +#define NUM_LEDS 150 // Change this to reflect the number of LEDs you have +#define BRIGHTNESS 255 // Set Brightness here + +CRGB leds[NUM_LEDS]; + +// ten seconds per color palette makes a good demo +// 20-120 is better for deployment +#define SECONDS_PER_PALETTE 30 + + +void setup() { + delay(1000); // 3 second delay for recovery + + // tell FastLED about the LED strip configuration + FastLED.addLeds(leds, NUM_LEDS) + .setCorrection(TypicalLEDStrip) // cpt-city palettes have different color balance + .setDither(BRIGHTNESS < 255); + + // set master brightness control + FastLED.setBrightness(BRIGHTNESS); +} + +// Forward declarations of an array of cpt-city gradient palettes, and +// a count of how many there are. The actual color palette definitions +// are at the bottom of this file. +extern const TProgmemRGBGradientPaletteRef gGradientPalettes[]; +extern const uint8_t gGradientPaletteCount; + +// Current palette number from the 'playlist' of color palettes +uint8_t gCurrentPaletteNumber = 0; + +CRGBPalette16 gCurrentPalette( CRGB::Black); +CRGBPalette16 gTargetPalette( gGradientPalettes[0] ); + + + + +// This function draws color waves with an ever-changing, +// widely-varying set of parameters, using a color palette. +void colorwaves( CRGB* ledarray, uint16_t numleds, CRGBPalette16& palette) +{ + static uint16_t sPseudotime = 0; + static uint16_t sLastMillis = 0; + static uint16_t sHue16 = 0; + + uint8_t sat8 = beatsin88( 87, 220, 250); + uint8_t brightdepth = beatsin88( 341, 225, 255); + uint16_t brightnessthetainc16 = beatsin88( 203, (25 * 256), (40 * 256)); + uint8_t msmultiplier = beatsin88(147, 23, 60); + + uint16_t hue16 = sHue16;//gHue * 256; + uint16_t hueinc16 = beatsin88(113, 300, 1500); + + uint16_t ms = millis(); + uint16_t deltams = ms - sLastMillis ; + sLastMillis = ms; + sPseudotime += deltams * msmultiplier; + sHue16 += deltams * beatsin88( 400, 5,9); + uint16_t brightnesstheta16 = sPseudotime; + + for( uint16_t i = 0 ; i < numleds; i++) { + hue16 += hueinc16; + uint8_t hue8 = hue16 / 256; + uint16_t h16_128 = hue16 >> 7; + if( h16_128 & 0x100) { + hue8 = 255 - (h16_128 >> 1); + } else { + hue8 = h16_128 >> 1; + } + + brightnesstheta16 += brightnessthetainc16; + uint16_t b16 = sin16( brightnesstheta16 ) + 32768; + + uint16_t bri16 = (uint32_t)((uint32_t)b16 * (uint32_t)b16) / 65536; + uint8_t bri8 = (uint32_t)(((uint32_t)bri16) * brightdepth) / 65536; + bri8 += (255 - brightdepth); + + uint8_t index = hue8; + //index = triwave8( index); + index = scale8( index, 240); + + CRGB newcolor = ColorFromPalette( palette, index, bri8); + + uint16_t pixelnumber = i; + pixelnumber = (numleds-1) - pixelnumber; + + nblend( ledarray[pixelnumber], newcolor, 128); + } +} + +// Alternate rendering function just scrolls the current palette +// across the defined LED strip. +void palettetest( CRGB* ledarray, uint16_t numleds, const CRGBPalette16& gCurrentPalette) +{ + static uint8_t startindex = 0; + startindex--; + fill_palette( ledarray, numleds, startindex, (256 / NUM_LEDS) + 1, gCurrentPalette, 255, LINEARBLEND); +} + +// Gradient palette "bhw1_01_gp", originally from +// http://soliton.vm.bytemark.co.uk/pub/cpt-city/bhw/bhw1/tn/bhw1_01.png.index.html +// converted for FastLED with gammas (2.6, 2.2, 2.5) +// Size: 12 bytes of program space. + +DEFINE_GRADIENT_PALETTE( bhw1_01_gp ) { + 0, 227,101, 3, + 117, 194, 18, 19, + 255, 92, 8,192}; + + // Gradient palette "bhw1_07_gp", originally from +// http://soliton.vm.bytemark.co.uk/pub/cpt-city/bhw/bhw1/tn/bhw1_07.png.index.html +// converted for FastLED with gammas (2.6, 2.2, 2.5) +// Size: 8 bytes of program space. + +DEFINE_GRADIENT_PALETTE( bhw1_07_gp ) { + 0, 232, 65, 1, + 255, 229,227, 1}; + + // Gradient palette "bhw1_sunset3_gp", originally from +// http://soliton.vm.bytemark.co.uk/pub/cpt-city/bhw/bhw1/tn/bhw1_sunset3.png.index.html +// converted for FastLED with gammas (2.6, 2.2, 2.5) +// Size: 28 bytes of program space. + +DEFINE_GRADIENT_PALETTE( bhw1_sunset3_gp ) { + 0, 227,237, 56, + 33, 186, 67, 1, + 71, 163, 21, 1, + 81, 157, 13, 1, + 188, 39, 21, 18, + 234, 12, 7, 4, + 255, 12, 7, 4}; + +// Gradient palette "bhw1_sunset2_gp", originally from +// http://soliton.vm.bytemark.co.uk/pub/cpt-city/bhw/bhw1/tn/bhw1_sunset2.png.index.html +// converted for FastLED with gammas (2.6, 2.2, 2.5) +// Size: 20 bytes of program space. + +DEFINE_GRADIENT_PALETTE( bhw1_sunset2_gp ) { + 0, 255,175, 8, + 81, 237, 29, 10, + 137, 148, 57, 42, + 165, 68, 54, 54, + 255, 18, 23, 29}; + +// Gradient palette "bhw2_sherbet2_gp", originally from +// http://soliton.vm.bytemark.co.uk/pub/cpt-city/bhw/bhw2/tn/bhw2_sherbet2.png.index.html +// converted for FastLED with gammas (2.6, 2.2, 2.5) +// Size: 32 bytes of program space. + +DEFINE_GRADIENT_PALETTE( bhw2_sherbet2_gp ) { + 0, 217, 1, 1, + 35, 249, 43, 19, + 71, 247,125,172, + 109, 206, 2, 32, + 163, 210, 23, 9, + 211, 255,255,255, + 232, 252,199, 88, + 255, 206,115, 52}; + +// Gradient palette "bhw2_39_gp", originally from +// http://soliton.vm.bytemark.co.uk/pub/cpt-city/bhw/bhw2/tn/bhw2_39.png.index.html +// converted for FastLED with gammas (2.6, 2.2, 2.5) +// Size: 28 bytes of program space. + +DEFINE_GRADIENT_PALETTE( bhw2_39_gp ) { + 0, 2,184,188, + 33, 56, 27,162, + 66, 56, 27,162, + 122, 255,255, 45, + 150, 227, 65, 6, + 201, 67, 13, 27, + 255, 16, 1, 53}; + +// Gradient palette "bhw2_sunsetx_gp", originally from +// http://soliton.vm.bytemark.co.uk/pub/cpt-city/bhw/bhw2/tn/bhw2_sunsetx.png.index.html +// converted for FastLED with gammas (2.6, 2.2, 2.5) +// Size: 36 bytes of program space. + +DEFINE_GRADIENT_PALETTE( bhw2_sunsetx_gp ) { + 0, 42, 55,255, + 25, 73,101,242, + 89, 115,162,228, + 107, 115,162,228, + 114, 100, 77,201, + 127, 86, 23,174, + 142, 190, 32, 24, + 171, 210,107, 42, + 255, 232,229, 67}; + +// Gradient palette "bhw2_xc_gp", originally from +// http://soliton.vm.bytemark.co.uk/pub/cpt-city/bhw/bhw2/tn/bhw2_xc.png.index.html +// converted for FastLED with gammas (2.6, 2.2, 2.5) +// Size: 28 bytes of program space. + +DEFINE_GRADIENT_PALETTE( bhw2_xc_gp ) { + 0, 4, 2, 9, + 58, 16, 0, 47, + 122, 24, 0, 16, + 158, 144, 9, 1, + 183, 179, 45, 1, + 219, 220,114, 2, + 255, 234,237, 1}; + +// Gradient palette "bhw2_07_gp", originally from +// http://soliton.vm.bytemark.co.uk/pub/cpt-city/bhw/bhw2/tn/bhw2_07.png.index.html +// converted for FastLED with gammas (2.6, 2.2, 2.5) +// Size: 24 bytes of program space. + +DEFINE_GRADIENT_PALETTE( bhw2_07_gp ) { + 0, 92, 1, 1, + 26, 153, 20, 5, + 79, 232, 72, 12, + 127, 220,231, 89, + 173, 232, 72, 12, + 255, 92, 1, 1}; + +// Gradient palette "bhw3_32_gp", originally from +// http://soliton.vm.bytemark.co.uk/pub/cpt-city/bhw/bhw3/tn/bhw3_32.png.index.html +// converted for FastLED with gammas (2.6, 2.2, 2.5) +// Size: 52 bytes of program space. + +DEFINE_GRADIENT_PALETTE( bhw3_32_gp ) { + 0, 234,231, 1, + 15, 171, 43, 6, + 40, 121, 0, 0, + 53, 95, 1, 29, + 71, 73, 1,168, + 94, 38, 63,221, + 109, 115, 51,221, + 127, 38, 63,221, + 147, 73, 1,168, + 181, 203, 28, 1, + 193, 155, 16, 11, + 216, 73, 1,168, + 255, 1, 4, 29}; + + +// Single array of defined cpt-city color palettes. +// This will let us programmatically choose one based on +// a number, rather than having to activate each explicitly +// by name every time. +// Since it is const, this array could also be moved +// into PROGMEM to save SRAM, but for simplicity of illustration +// we'll keep it in a regular SRAM array. +// +// This list of color palettes acts as a "playlist"; you can +// add or delete, or re-arrange as you wish. +const TProgmemRGBGradientPaletteRef gGradientPalettes[] = { + bhw3_32_gp, + bhw1_01_gp, + bhw1_07_gp, + bhw1_sunset3_gp, + bhw1_sunset2_gp, + bhw2_sherbet2_gp, + bhw2_39_gp, + bhw2_sunsetx_gp, + bhw2_xc_gp, + bhw2_07_gp, + }; + + +// Count of how many cpt-city gradients are defined: +const uint8_t gGradientPaletteCount = + sizeof( gGradientPalettes) / sizeof( TProgmemRGBGradientPaletteRef ); + void loop() +{ + EVERY_N_SECONDS( SECONDS_PER_PALETTE ) { + gCurrentPaletteNumber = addmod8( gCurrentPaletteNumber, 1, gGradientPaletteCount); + gTargetPalette = gGradientPalettes[ gCurrentPaletteNumber ]; + } + + EVERY_N_MILLISECONDS(1500) { + nblendPaletteTowardPalette( gCurrentPalette, gTargetPalette, 16); + } + + colorwaves( leds, NUM_LEDS, gCurrentPalette); + + FastLED.show(); + //FastLED.delay(50); +} diff --git a/Pulse_Oximeter_Logger/code.py b/Pulse_Oximeter_Logger/code.py index d6bb07ef8..79ced9d8e 100644 --- a/Pulse_Oximeter_Logger/code.py +++ b/Pulse_Oximeter_Logger/code.py @@ -21,7 +21,7 @@ import sdcardio import board import busio import storage -import adafruit_pcf8523 +from adafruit_pcf8523.pcf8523 import PCF8523 import _bleio import adafruit_ble from adafruit_ble.advertising.standard import Advertisement @@ -39,7 +39,7 @@ log_interval = 2 # you can adjust this to log at a different rate # RTC setup I2C = busio.I2C(board.SCL, board.SDA) -rtc = adafruit_pcf8523.PCF8523(I2C) +rtc = PCF8523(I2C) days = ("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday") diff --git a/PyPortal/Dashblock_API/code.py b/PyPortal/Dashblock_API/code.py index cefebb46e..761ce4220 100644 --- a/PyPortal/Dashblock_API/code.py +++ b/PyPortal/Dashblock_API/code.py @@ -8,19 +8,13 @@ Use Dashblock to create a custom API for learn.adafruit.com, then display the number of learn guides on the site """ +import os import time import board from adafruit_pyportal import PyPortal -# Get wifi details and more from a secrets.py file -try: - from secrets import secrets -except ImportError: - print("WiFi settings are kept in settings.py, please add them there!") - raise - # Set up where we'll be fetching data from -DATA_SOURCE = "https://api.dashblock.io/model/v1?api_key=" + secrets['dashblock_key'] +DATA_SOURCE = "https://api.dashblock.io/model/v1?api_key=" + os.getenv("DASHBLOCK_KEY") GUIDE_COUNT = ['entities', 0, 'guide count'] CAPTION = 'total tutorials:' diff --git a/PyPortal/PyPortal_AWS_IOT_Planter/code.py b/PyPortal/PyPortal_AWS_IOT_Planter/code.py index 91d74e9e0..ee44b40fd 100755 --- a/PyPortal/PyPortal_AWS_IOT_Planter/code.py +++ b/PyPortal/PyPortal_AWS_IOT_Planter/code.py @@ -10,6 +10,7 @@ notifications when it needs watering with your PyPortal. Author: Brent Rubell for Adafruit Industries, 2019 """ +import os import time import json import board @@ -27,12 +28,10 @@ import aws_gfx_helper # Time between polling the STEMMA, in minutes SENSOR_DELAY = 15 -# Get wifi details and more from a secrets.py file -try: - from secrets import secrets -except ImportError: - print("WiFi secrets are kept in secrets.py, please add them there!") - raise +secrets = { + "ssid" : os.getenv("CIRCUITPY_WIFI_SSID"), + "password" : os.getenv("CIRCUITPY_WIFI_PASSWORD"), +} # Get device certificate try: @@ -127,8 +126,8 @@ def message(client, topic, msg): print("Message from {}: {}".format(topic, msg)) # Set up a new MiniMQTT Client -client = MQTT.MQTT(broker = secrets['broker'], - client_id = secrets['client_id'], +client = MQTT.MQTT(broker = os.getenv("BROKER"), + client_id = os.getenv("CLIENT_ID"), socket_pool=pool, ssl_context=ssl_context) diff --git a/PyPortal/PyPortal_AirQuality/code.py b/PyPortal/PyPortal_AirQuality/code.py index cbb0c61aa..e7bf46623 100644 --- a/PyPortal/PyPortal_AirQuality/code.py +++ b/PyPortal/PyPortal_AirQuality/code.py @@ -7,17 +7,11 @@ This example will access the twitter follow button API, grab a number like the number of followers... and display it on a screen! if you can find something that spits out JSON data, we can display it """ +import os import time import board from adafruit_pyportal import PyPortal -# Get wifi details and more from a secrets.py file -try: - from secrets import secrets -except ImportError: - print("WiFi secrets are kept in secrets.py, please add them there!") - raise - # Change this to your zip code, not all locations have AQI data. Check # https://airnow.gov/ to see if there's data available! LOCATION = "90210" @@ -25,7 +19,7 @@ LOCATION = "90210" # Set up where we'll be fetching data from DATA_SOURCE = "http://www.airnowapi.org/aq/forecast/zipCode/?format=application/json" # You'll need to get a token from airnow.gov, looks like '4d36e978-e325-11cec1-08002be10318' -DATA_SOURCE += "&zipCode="+LOCATION+"&API_KEY="+secrets['airnow_token'] +DATA_SOURCE += "&zipCode="+LOCATION+"&API_KEY="+os.getenv("AIRNOW_TOKEN") DATA_LOCATION = [1, "AQI"] # the current working directory (where this file is) diff --git a/PyPortal/PyPortal_Google_Calendar/authenticator/code.py b/PyPortal/PyPortal_Google_Calendar/authenticator/code.py index 6aef41560..1764b58bb 100644 --- a/PyPortal/PyPortal_Google_Calendar/authenticator/code.py +++ b/PyPortal/PyPortal_Google_Calendar/authenticator/code.py @@ -1,21 +1,14 @@ # SPDX-FileCopyrightText: 2021 Brent Rubell, written for Adafruit Industries # # SPDX-License-Identifier: Unlicense + +import os + from adafruit_display_text.label import Label from adafruit_bitmap_font import bitmap_font from adafruit_oauth2 import OAuth2 from adafruit_pyportal import Network, Graphics -# Add a secrets.py to your filesystem that has a dictionary called secrets with "ssid" and -# "password" keys with your WiFi credentials. DO NOT share that file or commit it into Git or other -# source control. -# pylint: disable=no-name-in-module,wrong-import-order -try: - from secrets import secrets -except ImportError: - print("WiFi secrets are kept in secrets.py, please add them there!") - raise - network = Network() network.connect() @@ -50,8 +43,8 @@ scopes = ["https://www.googleapis.com/auth/calendar.readonly"] # Initialize an oauth2 object google_auth = OAuth2( network.requests, - secrets["google_client_id"], - secrets["google_client_secret"], + os.getenv("GOOGLE_CLIENT_ID"), + os.getenv("GOOGLE_CLIENT_SECRET"), scopes, ) @@ -78,7 +71,7 @@ label_user_code.text = "2. Enter code: %s" % google_auth.user_code # Create a QR code graphics.qrcode(google_auth.verification_url.encode(), qr_size=2, x=170, y=165) -graphics.display.show(graphics.splash) +graphics.display.root_group = graphics.splash # Poll Google's authorization server print("Waiting for browser authorization...") @@ -87,10 +80,10 @@ if not google_auth.wait_for_authorization(): print("Successfully Authenticated with Google!") -# print formatted keys for adding to secrets.py -print("Add the following lines to your secrets.py file:") -print("\t'google_access_token' " + ":" + " '%s'," % google_auth.access_token) -print("\t'google_refresh_token' " + ":" + " '%s'" % google_auth.refresh_token) +# print formatted keys for adding to settings.toml +print("Add the following lines to your settings.toml file:") +print(f'GOOGLE_ACCESS_TOKEN = "{google_auth.access_token}"') +print(f'GOOGLE_REFRESH_TOKEN = "{google_auth.refresh_token}"') # Remove QR code and code/verification labels graphics.splash.pop() graphics.splash.pop() @@ -98,7 +91,7 @@ graphics.splash.pop() label_overview_text.text = "Successfully Authenticated!" label_verification_url.text = ( - "Check the REPL for tokens to add\n\tto your secrets.py file" + "Check the REPL for tokens to add\n\tto your settings.toml file" ) # prevent exit diff --git a/PyPortal/PyPortal_Google_Calendar/code.py b/PyPortal/PyPortal_Google_Calendar/code.py index ada4e997d..9aa515ba8 100644 --- a/PyPortal/PyPortal_Google_Calendar/code.py +++ b/PyPortal/PyPortal_Google_Calendar/code.py @@ -1,6 +1,7 @@ # SPDX-FileCopyrightText: 2021 Brent Rubell, written for Adafruit Industries # # SPDX-License-Identifier: Unlicense +import os import time from adafruit_oauth2 import OAuth2 from adafruit_display_shapes.line import Line @@ -42,16 +43,6 @@ WEEKDAYS = { 6: "Sunday", } -# Add a secrets.py to your filesystem that has a dictionary called secrets with "ssid" and -# "password" keys with your WiFi credentials. DO NOT share that file or commit it into Git or other -# source control. -# pylint: disable=no-name-in-module,wrong-import-order -try: - from secrets import secrets -except ImportError: - print("WiFi secrets are kept in secrets.py, please add them there!") - raise - # Create the PyPortal object pyportal = PyPortal() r = rtc.RTC() @@ -63,18 +54,18 @@ pyportal.network.connect() scopes = ["https://www.googleapis.com/auth/calendar.readonly"] google_auth = OAuth2( pyportal.network.requests, - secrets["google_client_id"], - secrets["google_client_secret"], + os.getenv("GOOGLE_CLIENT_ID"), + os.getenv("GOOGLE_CLIENT_SECRET"), scopes, - secrets["google_access_token"], - secrets["google_refresh_token"], + os.getenv("GOOGLE_ACCESS_TOKEN"), + os.getenv("GOOGLE_REFRESH_TOKEN"), ) def get_current_time(time_max=False): """Gets local time from Adafruit IO and converts to RFC3339 timestamp.""" # Get local time from Adafruit IO - pyportal.get_local_time(secrets["timezone"]) + pyportal.get_local_time(os.getenv("TIMEZONE")) # Format as RFC339 timestamp cur_time = r.datetime if time_max: # maximum time to fetch events is midnight (4:59:59UTC) diff --git a/PyPortal/PyPortal_Halloween_Countdown/code.py b/PyPortal/PyPortal_Halloween_Countdown/code.py index c72f9c434..6bdf44fc5 100644 --- a/PyPortal/PyPortal_Halloween_Countdown/code.py +++ b/PyPortal/PyPortal_Halloween_Countdown/code.py @@ -17,6 +17,7 @@ All text above must be included in any redistribution. """ #pylint:disable=invalid-name +import os import time import random import board @@ -24,13 +25,6 @@ from adafruit_pyportal import PyPortal from adafruit_bitmap_font import bitmap_font from adafruit_display_text.label import Label -try: - from secrets import secrets -except ImportError: - print("""WiFi settings are kept in secrets.py, please add them there! -the secrets dictionary must contain 'ssid' and 'password' at a minimum""") - raise - # The time of the thing! EVENT_YEAR = 2019 EVENT_MONTH = 10 @@ -89,7 +83,7 @@ while True: if (not refresh_time) or (time.monotonic() - refresh_time) > 3600: try: print("Getting time from internet!") - pyportal.get_local_time(location=secrets['timezone']) + pyportal.get_local_time(location=os.getenv("TIMEZONE")) refresh_time = time.monotonic() except RuntimeError as e: print("Some error occured, retrying! -", e) diff --git a/PyPortal/PyPortal_LIFX_Controller/code.py b/PyPortal/PyPortal_LIFX_Controller/code.py index 4fa95bd93..ebe489e89 100755 --- a/PyPortal/PyPortal_LIFX_Controller/code.py +++ b/PyPortal/PyPortal_LIFX_Controller/code.py @@ -9,6 +9,8 @@ https://learn.adafruit.com/pyportal-smart-lighting-controller Brent Rubell for Adafruit Industries, 2019 """ +import os + import board import displayio from adafruit_bitmap_font import bitmap_font @@ -24,12 +26,10 @@ from adafruit_esp32spi import adafruit_esp32spi_wifimanager # import lifx library import adafruit_lifx -# Get wifi details and more from a secrets.py file -try: - from secrets import secrets -except ImportError: - print("WiFi secrets are kept in secrets.py, please add them there!") - raise +secrets = { + "ssid" : os.getenv("CIRCUITPY_WIFI_SSID"), + "password" : os.getenv("CIRCUITPY_WIFI_PASSWORD"), +} # ESP32 SPI esp32_cs = DigitalInOut(board.ESP_CS) @@ -47,9 +47,9 @@ ts = adafruit_touchscreen.Touchscreen(board.TOUCH_XL, board.TOUCH_XR, calibration=((5200, 59000), (5800, 57000)), size=(320, 240)) -# Set this to your LIFX personal access token in secrets.py +# Set this to your LIFX personal access token in settings.toml # (to obtain a token, visit: https://cloud.lifx.com/settings) -lifx_token = secrets['lifx_token'] +lifx_token = os.getenv("LIFX_TOKEN") # Initialize the LIFX API Helper lifx = adafruit_lifx.LIFX(wifi, lifx_token) diff --git a/PyPortal/PyPortal_LeagueLevel/code.py b/PyPortal/PyPortal_LeagueLevel/code.py index e20c50118..c8e178895 100644 --- a/PyPortal/PyPortal_LeagueLevel/code.py +++ b/PyPortal/PyPortal_LeagueLevel/code.py @@ -8,22 +8,17 @@ and display it on a screen. You'll need a Riot API key in your secrets.py file If you can find something that spits out JSON data, we can display it! """ +import os import time import board from adafruit_pyportal import PyPortal -try: - from secrets import secrets -except ImportError: - print("WiFi secrets are kept in secrets.py, please add them there!") - raise - #Choose a valid Summoner name SUMMONER_NAME = "RiotSchmick" # Set up where we'll be fetching data from DATA_SOURCE = "https://na1.api.riotgames.com/lol/summoner/v4/summoners/by-name/"+SUMMONER_NAME -DATA_SOURCE += "?api_key="+secrets['league_token'] +DATA_SOURCE += "?api_key=" + os.getenv("LEAGUE_TOKEN") DATA_LOCATION = ["summonerLevel"] CAPTION = "SUMMONER "+SUMMONER_NAME diff --git a/PyPortal/PyPortal_Philips_Hue_Controller/code.py b/PyPortal/PyPortal_Philips_Hue_Controller/code.py index 4713eecef..9e12aab05 100644 --- a/PyPortal/PyPortal_Philips_Hue_Controller/code.py +++ b/PyPortal/PyPortal_Philips_Hue_Controller/code.py @@ -7,6 +7,8 @@ PyPortal Philips Hue Lighting Controller Brent Rubell for Adafruit Industries, 2019 """ +import os + import board import displayio from adafruit_bitmap_font import bitmap_font @@ -21,12 +23,9 @@ from adafruit_esp32spi import adafruit_esp32spi_wifimanager # Import Philips Hue Bridge from adafruit_hue import Bridge -# Get wifi details and more from a secrets.py file -try: - from secrets import secrets -except ImportError: - print("WiFi secrets are kept in secrets.py, please add them there!") - raise +secrets = dict() +secrets["ssid"] = os.getenv("CIRCUITPY_WIFI_SSID") +secrets["password"] = os.getenv("CIRCUITPY_WIFI_PASSWORD") # ESP32 SPI esp32_cs = DigitalInOut(board.ESP_CS) @@ -39,8 +38,8 @@ wifi = adafruit_esp32spi_wifimanager.ESPSPI_WiFiManager(esp, secrets, status_lig # Attempt to load bridge username and IP address from secrets.py try: - username = secrets['hue_username'] - bridge_ip = secrets['bridge_ip'] + username = os.getenv("HUE_USERNAME") + bridge_ip = os.getenv("BRIDGE_IP") my_bridge = Bridge(wifi, bridge_ip, username) except: # Perform first-time bridge setup @@ -49,9 +48,9 @@ except: ip = my_bridge.discover_bridge() print('Attempting to register username, press the link button on your Hue Bridge now!') username = my_bridge.register_username() - print('ADD THESE VALUES TO SECRETS.PY: \ - \n\t"bridge_ip":"{0}", \ - \n\t"hue_username":"{1}"'.format(ip, username)) + print(f'ADD THESE VALUES TO settings.toml: \ + \nBRIDGE_IP = "{ip}" \ + \nHUE_USERNAME = "{username}"') raise # These pins are used as both analog and digital! XL, XR and YU must be analog diff --git a/PyPortal/PyPortal_Quarantine_Clock/code.py b/PyPortal/PyPortal_Quarantine_Clock/code.py index 347f38665..06144e5f8 100755 --- a/PyPortal/PyPortal_Quarantine_Clock/code.py +++ b/PyPortal/PyPortal_Quarantine_Clock/code.py @@ -2,6 +2,7 @@ # # SPDX-License-Identifier: MIT +import os import time import board import busio @@ -13,13 +14,6 @@ from adafruit_pyportal import PyPortal from adafruit_bitmap_font import bitmap_font from adafruit_display_text import label -try: - from secrets import secrets -except ImportError: - print("""WiFi settings are kept in secrets.py, please add them there! -the secrets dictionary must contain 'ssid' and 'password' at a minimum""") - raise - # Label colors LABEL_DAY_COLOR = 0xFFFFFF LABEL_TIME_COLOR = 0x2a8eba @@ -88,7 +82,7 @@ while True: if (not refresh_time) or (time.monotonic() - refresh_time) > 3600: try: print("Getting new time from internet...") - pyportal.get_local_time(secrets['timezone']) + pyportal.get_local_time(os.getenv("TIMEZONE")) refresh_time = time.monotonic() # set the_time the_time = time.localtime() diff --git a/PyPortal/PyPortal_TOTP_Friend/code.py b/PyPortal/PyPortal_TOTP_Friend/code.py index 99cceb019..933b3c921 100644 --- a/PyPortal/PyPortal_TOTP_Friend/code.py +++ b/PyPortal/PyPortal_TOTP_Friend/code.py @@ -2,6 +2,7 @@ # # SPDX-License-Identifier: MIT +import os import time import board @@ -35,11 +36,11 @@ ALWAYS_ON = True # How long to stay on if not in always_on mode ON_SECONDS = 60 -# Get wifi details and more from a secrets.py file +# Get totp keys from a secrets.py file try: from secrets import secrets except ImportError: - print("WiFi secrets are kept in secrets.py, please add them there!") + print("TOTP keys are kept in secrets.py, please add them there!") raise # Initialize PyPortal Display @@ -200,12 +201,12 @@ display.root_group = splash print("Connecting to AP...") while not esp.is_connected: try: - esp.connect_AP(secrets['ssid'], secrets['password']) + esp.connect_AP(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD")) except RuntimeError as e: print("Could not connect to AP, retrying: ", e) continue -print("Connected to ", secrets['ssid']) +print("Connected") # get_time will raise ValueError if the time isn't available yet so loop until # it works. diff --git a/PyPortal/PyPortal_TOTP_Friend/secrets.py b/PyPortal/PyPortal_TOTP_Friend/secrets.py index b0452417e..19cd6267c 100755 --- a/PyPortal/PyPortal_TOTP_Friend/secrets.py +++ b/PyPortal/PyPortal_TOTP_Friend/secrets.py @@ -6,10 +6,6 @@ # If you put them in the code you risk committing that info or sharing it secrets = { - 'ssid' : 'yourwifissid', - 'password' : 'yourwifipassword', - 'timezone' : "America/New_York", # http://worldtimeapi.org/timezones - # https://github.com/pyotp/pyotp example 'totp_keys' : [("Discord ", "JBSWY3DPEHPK3PXP"), ("Gmail", "JBSWY3DPEHPK3PZP"), ("GitHub", "JBSWY5DZEHPK3PXP"), diff --git a/PyPortal/PyPortal_Thingiverse/code.py b/PyPortal/PyPortal_Thingiverse/code.py index 10c5fd8ae..402bb7305 100644 --- a/PyPortal/PyPortal_Thingiverse/code.py +++ b/PyPortal/PyPortal_Thingiverse/code.py @@ -2,22 +2,16 @@ # # SPDX-License-Identifier: MIT +import os import time import random import board import adafruit_pyportal -# Get wifi details and more from a settings.py file -try: - from secrets import secrets -except ImportError: - print("WiFi secrets are kept in secrets.py, please add them there!") - raise - # Set up where we'll be fetching data from NUM_THINGS=25 # how many things to select from (we randomize between em) DATA_SOURCE = "https://api.thingiverse.com/users/adafruit/things?per_page="+str(NUM_THINGS) -DATA_SOURCE += "&access_token=" + secrets['thingiverse_token'] +DATA_SOURCE += "&access_token=" + os.getenv("THINGIVERSE_TOKEN") IMAGE_LOCATION = [0, "thumbnail"] TITLE_LOCATION = [0, "name"] URL_LOCATION = [0, "public_url"] diff --git a/PyPortal/PyPortal_Titano_Weather_Station/code.py b/PyPortal/PyPortal_Titano_Weather_Station/code.py index bf8041eb7..9628aca9f 100644 --- a/PyPortal/PyPortal_Titano_Weather_Station/code.py +++ b/PyPortal/PyPortal_Titano_Weather_Station/code.py @@ -206,7 +206,7 @@ while True: print("trash time") alarm = True if alarm and not dismissed and not snoozed: - display.show(alarm_gfx[w]) + display.root_group = alarm_gfx[w] pyportal.play_file(alarm_sounds[w]) mode = w print("mode is:", mode) @@ -216,7 +216,7 @@ while True: if time_str == alarm_checks[a]: alarm = True if alarm and not dismissed and not snoozed: - display.show(alarm_gfx[a]) + display.root_group = alarm_gfx[a] pyportal.play_file(alarm_sounds[a]) mode = a print(mode) @@ -244,13 +244,13 @@ while True: print("pressed dismiss button") dismissed = True alarm = False - display.show(pyportal.splash) + display.root_group = pyportal.splash touched = time.monotonic() mode = mode if not switch_snooze.value and not phys_snooze: phys_snooze = True print("pressed snooze button") - display.show(pyportal.splash) + display.root_group = pyportal.splash snoozed = True alarm = False touched = time.monotonic() @@ -265,7 +265,7 @@ while True: if touch: if snooze_buttons[button_mode].contains(touch) and not touch_button_snooze: print("Touched snooze") - display.show(pyportal.splash) + display.root_group = pyportal.splash touch_button_snooze = True snoozed = True alarm = False @@ -275,7 +275,7 @@ while True: print("Touched dismiss") dismissed = True alarm = False - display.show(pyportal.splash) + display.root_group = pyportal.splash touch_button_dismiss = True touched = time.monotonic() mode = mode @@ -294,6 +294,6 @@ while True: snoozed = False alarm = True mode = mode - display.show(alarm_gfx[mode]) + display.root_group = alarm_gfx[mode] pyportal.play_file(alarm_sounds[mode]) print(mode) diff --git a/PyPortal/PyPortal_Wheres_My_Friend/code.py b/PyPortal/PyPortal_Wheres_My_Friend/code.py new file mode 100755 index 000000000..5f81b78b3 --- /dev/null +++ b/PyPortal/PyPortal_Wheres_My_Friend/code.py @@ -0,0 +1,117 @@ +# SPDX-FileCopyrightText: 2024 Brent Rubell, written for Adafruit Industries +# +# SPDX-License-Identifier: MIT +import time +import board +import displayio +import terminalio +from adafruit_display_shapes.rect import Rect +from adafruit_display_text import label +from adafruit_pyportal import PyPortal + +# Adafruit IO shared feed key +IO_FEED_KEY = 'location' +# Fetch the location every 5 minutes +SLEEP_DELAY_MINUTES = 5 +# Set the backlight brightness, 0.0 (off) to 1.0 (max brightness) +BACKLIGHT_BRIGHTNESS = 0.5 +# Location text and images +LOCATION_IMAGES = { 'home': 'images/home.bmp', 'work': 'images/office.bmp', + 'gym': 'images/workout.bmp', 'commute': 'images/subway.bmp' } + +# Create the PyPortal object +pyportal = PyPortal(status_neopixel=board.NEOPIXEL) + +# Configure the PyPortal's display +display = board.DISPLAY +display.rotation = 0 +display.brightness = BACKLIGHT_BRIGHTNESS + +# Display label and image coordinates +TEXT_AREA_X = display.width // 6 +TEXT_AREA_Y = 20 +TEXT_AREA_LOCATION_X = display.width // 3 +TEXT_AREA_LOCATION_Y = display.height - 20 +IMAGE_SPRITE_X = (display.width // 3) - 10 +IMAGE_SPRITE_Y = display.height // 5 + +# Create a displayIO Group +group = displayio.Group() + +# Draw the background +bg_group = displayio.Group() +rect = Rect(0, 0, display.width, display.height, fill=0xFFFFFF) +bg_group.append(rect) +group.append(bg_group) + +# Use the default font +font = terminalio.FONT + +# Draw a label for the header text +text_area = label.Label(font, text="Where's My Friend?", color=0x000000, scale=2) +text_area.x = TEXT_AREA_X +text_area.y = TEXT_AREA_Y +group.append(text_area) + +# Draw a label for the location text +text_area_location = label.Label(font, text="", color=0x000000, scale=3) +text_area_location.x = TEXT_AREA_LOCATION_X +text_area_location.y = TEXT_AREA_LOCATION_Y +group.append(text_area_location) + +# Create a group for the icon only +icon_group = displayio.Group() +group.append(icon_group) + +# Show the group +display.root_group = group + +def set_image(image_group, filename): + """Sets the image file for a given group for display.""" + print(f"Set image to {filename}") + if image_group: + image_group.pop() + + image_file = open(filename, "rb") + image = displayio.OnDiskBitmap(image_file) + image_sprite = displayio.TileGrid(image, + pixel_shader=getattr(image, 'pixel_shader', + displayio.ColorConverter())) + image_sprite.x = IMAGE_SPRITE_X + image_sprite.y = IMAGE_SPRITE_Y + image_group.append(image_sprite) + +prv_location = None +while True: + try: + print("Fetching location data...") + # Fetch the location data from Adafruit IO + feed = pyportal.get_io_feed(IO_FEED_KEY) + # If the location value is in the list of images + if feed['last_value'] in LOCATION_IMAGES: + # Check if the location has changed from the last time + # we fetched the location + if prv_location == feed['last_value']: + print("Location has not changed!") + else: # Location has changed + print(f"Location: {feed['last_value']}") + # Load the image for the current location + set_image(icon_group, LOCATION_IMAGES[feed['last_value']]) + # Update the location text + text_area_location.text=f"@ {feed['last_value']}" + # Show the refreshed group + display.root_group = group + # Update the previous location + prv_location = feed['last_value'] + else: + print("Location not found in images!") + # Update the location text + text_area_location.text="@ unknown" + # Show the refreshed group + display.root_group = group + except RuntimeError as e: + print("Failed to fetch location data: ", e) + + # Wait 5 minutes (300 seconds) before fetching the location feed again + print("Sleeping, fetching the location again in 5 minutes!") + time.sleep(SLEEP_DELAY_MINUTES * 60) diff --git a/PyPortal/PyPortal_Wheres_My_Friend/images/home.bmp b/PyPortal/PyPortal_Wheres_My_Friend/images/home.bmp new file mode 100755 index 000000000..d0c17d0b6 Binary files /dev/null and b/PyPortal/PyPortal_Wheres_My_Friend/images/home.bmp differ diff --git a/PyPortal/PyPortal_Wheres_My_Friend/images/office.bmp b/PyPortal/PyPortal_Wheres_My_Friend/images/office.bmp new file mode 100755 index 000000000..40f713316 Binary files /dev/null and b/PyPortal/PyPortal_Wheres_My_Friend/images/office.bmp differ diff --git a/PyPortal/PyPortal_Wheres_My_Friend/images/subway.bmp b/PyPortal/PyPortal_Wheres_My_Friend/images/subway.bmp new file mode 100755 index 000000000..751ee17ab Binary files /dev/null and b/PyPortal/PyPortal_Wheres_My_Friend/images/subway.bmp differ diff --git a/PyPortal/PyPortal_Wheres_My_Friend/images/workout.bmp b/PyPortal/PyPortal_Wheres_My_Friend/images/workout.bmp new file mode 100755 index 000000000..9e86448b2 Binary files /dev/null and b/PyPortal/PyPortal_Wheres_My_Friend/images/workout.bmp differ diff --git a/PyPortal/PyPortal_Word_of_the_Day/code.py b/PyPortal/PyPortal_Word_of_the_Day/code.py index 1935eb6fe..c85118d3e 100755 --- a/PyPortal/PyPortal_Word_of_the_Day/code.py +++ b/PyPortal/PyPortal_Word_of_the_Day/code.py @@ -8,69 +8,67 @@ Each day a new word, its part of speech, and definition will appear automatically on the display. Tap the screen to start as well as to switch between the word's definition and an example sentence. """ +import os import board from adafruit_pyportal import PyPortal -# Get wifi details and more from a secrets.py file -try: - from secrets import secrets -except ImportError: - print("WiFi settings are kept in settings.py, please add them there!") - raise - # Set up where we'll be fetching data from -DATA_SOURCE = "https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key="+secrets['wordnik_token'] -PART_OF_SPEECH = ['definitions', 0, 'partOfSpeech'] -DEF_LOCATION = ['definitions', 0, 'text'] -EXAMPLE_LOCATION = ['examples', 0, 'text'] -CAPTION = 'wordnik.com/word-of-the-day' +DATA_SOURCE = "https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key=" + os.getenv( + "WORDNIK_TOKEN" +) +PART_OF_SPEECH = ["definitions", 0, "partOfSpeech"] +DEF_LOCATION = ["definitions", 0, "text"] +EXAMPLE_LOCATION = ["examples", 0, "text"] +CAPTION = "wordnik.com/word-of-the-day" DEFINITION_EXAMPLE_ARR = [DEF_LOCATION, EXAMPLE_LOCATION] -#defintion and example array variable initialized at 0 +# defintion and example array variable initialized at 0 definition_example = 0 # determine the current working directory # needed so we know where to find files -cwd = ("/"+__file__).rsplit('/', 1)[0] +cwd = ("/" + __file__).rsplit("/", 1)[0] # Initialize the pyportal object and let us know what data to fetch and where # to display it -pyportal = PyPortal(url=DATA_SOURCE, - status_neopixel=board.NEOPIXEL, - default_bg=cwd+"/wordoftheday_background.bmp", - text_font=cwd+"/fonts/Arial-ItalicMT-17.bdf", - text_position=((50, 30), # word location - (50, 50), # part of speech location - (50, 135)), # definition location - text_color=(0x8080FF, - 0xFF00FF, - 0xFFFFFF), - text_wrap=(0, # characters to wrap for text - 0, - 28), - text_maxlen=(180, 30, 115), # max text size for word, part of speech and def - caption_text=CAPTION, - caption_font=cwd+"/fonts/Arial-ItalicMT-17.bdf", - caption_position=(50, 220), - caption_color=0x808080) +pyportal = PyPortal( + url=DATA_SOURCE, + status_neopixel=board.NEOPIXEL, + default_bg=cwd + "/wordoftheday_background.bmp", + text_font=cwd + "/fonts/Arial-ItalicMT-17.bdf", + text_position=( + (50, 30), # word location + (50, 50), # part of speech location + (50, 135), + ), # definition location + text_color=(0x8080FF, 0xFF00FF, 0xFFFFFF), + text_wrap=(0, 0, 28), # characters to wrap for text + text_maxlen=(180, 30, 115), # max text size for word, part of speech and def + caption_text=CAPTION, + caption_font=cwd + "/fonts/Arial-ItalicMT-17.bdf", + caption_position=(50, 220), + caption_color=0x808080, +) -print("loading...") # print to repl while waiting for font to load -pyportal.preload_font() # speed things up by preloading font -pyportal.set_text("\nWord of the Day") # show title +print("loading...") # print to repl while waiting for font to load +pyportal.preload_font() # speed things up by preloading font +pyportal.set_text("\nWord of the Day") # show title while True: if pyportal.touchscreen.touch_point: try: - #set the JSON path here to be able to change between definition and example + # set the JSON path here to be able to change between definition and example # pylint: disable=protected-access - pyportal._json_path=(['word'], - PART_OF_SPEECH, - DEFINITION_EXAMPLE_ARR[definition_example]) + pyportal._json_path = ( + ["word"], + PART_OF_SPEECH, + DEFINITION_EXAMPLE_ARR[definition_example], + ) value = pyportal.fetch() print("Response is", value) except RuntimeError as e: print("Some error occured, retrying! -", e) - #Change between definition and example + # Change between definition and example if definition_example == 0: definition_example = 1 elif definition_example == 1: diff --git a/PyPortal/PyPortal_Youtube/code.py b/PyPortal/PyPortal_Youtube/code.py index 5cc6eae87..f6b058359 100644 --- a/PyPortal/PyPortal_Youtube/code.py +++ b/PyPortal/PyPortal_Youtube/code.py @@ -9,17 +9,11 @@ If you can find something that spits out JSON data, we can display it! Requires a youtube API key! """ +import os import time import board from adafruit_pyportal import PyPortal -# Get wifi details and more from a secrets.py file -try: - from secrets import secrets -except ImportError: - print("WiFi secrets are kept in secrets.py, please add them there!") - raise - # Set up where we'll be fetching data from CHANNEL_ID = "UCpOlOeQjj7EsVnDh3zuCgsA" # this isn't a secret but you have to look it up #CHANNEL_ID = "UC6p-tjZN8s9GBSbiN4K-bwg" @@ -27,7 +21,7 @@ CAPTION = "www.youtube.com/adafruit" #CAPTION = "www.youtube.com/c/JohnParkMakes" # pylint: disable=line-too-long -DATA_SOURCE = "https://www.googleapis.com/youtube/v3/channels/?part=statistics&id="+CHANNEL_ID+"&key="+secrets['youtube_token'] +DATA_SOURCE = "https://www.googleapis.com/youtube/v3/channels/?part=statistics&id="+CHANNEL_ID+"&key="+os.getenv("YOUTUBE_TOKEN") DATA_LOCATION1 = ["items", 0, "statistics", "viewCount"] DATA_LOCATION2 = ["items", 0, "statistics", "subscriberCount"] # pylint: enable=line-too-long diff --git a/PyPortal/pyportal_pet_planter/code.py b/PyPortal/pyportal_pet_planter/code.py index 202b634af..e0dfaa66c 100755 --- a/PyPortal/pyportal_pet_planter/code.py +++ b/PyPortal/pyportal_pet_planter/code.py @@ -2,6 +2,7 @@ # # SPDX-License-Identifier: MIT +import os import time import board @@ -51,12 +52,10 @@ wav_water_low = "/sounds/water-low.wav" # the current working directory (where this file is) cwd = ("/"+__file__).rsplit('/', 1)[0] -# Get wifi details and more from a secrets.py file -try: - from secrets import secrets -except ImportError: - print("WiFi secrets are kept in secrets.py, please add them there!") - raise +secrets = { + "ssid" : os.getenv("CIRCUITPY_WIFI_SSID"), + "password" : os.getenv("CIRCUITPY_WIFI_PASSWORD"), +} # Set up i2c bus i2c_bus = busio.I2C(board.SCL, board.SDA) @@ -191,8 +190,8 @@ ssl_context = adafruit_connection_manager.get_radio_ssl_context(esp) # Initialize a new MQTT Client object mqtt_client = MQTT.MQTT(broker="io.adafruit.com", - username=secrets["aio_user"], - password=secrets["aio_key"], + username=os.getenv("AIO_USERNAME"), + password=os.getenv("AIO_KEY"), socket_pool=pool, ssl_context=ssl_context) diff --git a/QT2040_Trinkey/bongo_cat/bongo.bmp b/QT2040_Trinkey/bongo_cat/bongo.bmp new file mode 100644 index 000000000..9a28ea917 Binary files /dev/null and b/QT2040_Trinkey/bongo_cat/bongo.bmp differ diff --git a/QT2040_Trinkey/bongo_cat/code.py b/QT2040_Trinkey/bongo_cat/code.py new file mode 100644 index 000000000..7f83748d1 --- /dev/null +++ b/QT2040_Trinkey/bongo_cat/code.py @@ -0,0 +1,46 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +import displayio +import adafruit_displayio_ssd1306 +import adafruit_imageload + +#display setup +displayio.release_displays() + +i2c = board.STEMMA_I2C() +# oled +oled_reset = board.D9 +display_bus = displayio.I2CDisplay(i2c, device_address=0x3D, reset=oled_reset) +WIDTH = 128 +HEIGHT = 64 +display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=WIDTH, height=HEIGHT) + +# default group +group = displayio.Group() +display.root_group = group + +# graphics bitmap +bitmap, palette_bit = adafruit_imageload.load( + "/bongo.bmp", + bitmap=displayio.Bitmap, + palette=displayio.Palette, +) +tile_grid = displayio.TileGrid(bitmap, pixel_shader=palette_bit, + width=1, height=1, + tile_height=64, tile_width=105, + default_tile=0, x = 7) +group.append(tile_grid) + +bongo = 0 +index = 0 +delay = 0.15 + +while True: + if (bongo + delay) < time.monotonic(): + tile_grid[0] = index + index = 1 if index == 0 else 0 + bongo = time.monotonic() diff --git a/QT_Py_CH32_Examples/Blink_QTPyCH32/.none.test.only b/QT_Py_CH32_Examples/Blink_QTPyCH32/.none.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/QT_Py_CH32_Examples/Blink_QTPyCH32/Blink_QTPyCH32.bin b/QT_Py_CH32_Examples/Blink_QTPyCH32/Blink_QTPyCH32.bin new file mode 100644 index 000000000..2eb370113 Binary files /dev/null and b/QT_Py_CH32_Examples/Blink_QTPyCH32/Blink_QTPyCH32.bin differ diff --git a/QT_Py_CH32_Examples/Blink_QTPyCH32/Blink_QTPyCH32.ino b/QT_Py_CH32_Examples/Blink_QTPyCH32/Blink_QTPyCH32.ino new file mode 100644 index 000000000..bdd6b6c5b --- /dev/null +++ b/QT_Py_CH32_Examples/Blink_QTPyCH32/Blink_QTPyCH32.ino @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2024 Ha Thach for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include // required for USB Serial + +const int led = PA6; + +void setup () { + pinMode(led, OUTPUT); +} + +void loop () { + Serial.println("LED on"); + digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) + delay(1000); // wait for a second + + Serial.println("LED off"); + digitalWrite(led, LOW); // turn the LED off by making the voltage LOW + delay(1000); // wait for a second +} diff --git a/QT_Py_CH32_Examples/HID_Keyboard_QTPyCH32/.none.test.only b/QT_Py_CH32_Examples/HID_Keyboard_QTPyCH32/.none.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/QT_Py_CH32_Examples/HID_Keyboard_QTPyCH32/HID_Keyboard_QTPyCH32.bin b/QT_Py_CH32_Examples/HID_Keyboard_QTPyCH32/HID_Keyboard_QTPyCH32.bin new file mode 100644 index 000000000..75636bcf2 Binary files /dev/null and b/QT_Py_CH32_Examples/HID_Keyboard_QTPyCH32/HID_Keyboard_QTPyCH32.bin differ diff --git a/QT_Py_CH32_Examples/HID_Keyboard_QTPyCH32/HID_Keyboard_QTPyCH32.ino b/QT_Py_CH32_Examples/HID_Keyboard_QTPyCH32/HID_Keyboard_QTPyCH32.ino new file mode 100644 index 000000000..0170bf79c --- /dev/null +++ b/QT_Py_CH32_Examples/HID_Keyboard_QTPyCH32/HID_Keyboard_QTPyCH32.ino @@ -0,0 +1,174 @@ +// SPDX-FileCopyrightText: 2024 Ha Thach for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/********************************************************************* + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + MIT license, check LICENSE for more information + Copyright (c) 2019 Ha Thach for Adafruit Industries + All text above, and the splash screen below must be included in + any redistribution +*********************************************************************/ + +#include +#include "Adafruit_TinyUSB.h" +#include + +const int neopixel_pin = PA4; +#define LED_COUNT 1 +Adafruit_NeoPixel pixels(LED_COUNT, neopixel_pin, NEO_GRB + NEO_KHZ800); + +//------------- Input Pins -------------// +// Array of pins and its keycode. +// Notes: these pins can be replaced by PIN_BUTTONn if defined in setup() + +uint8_t pins[] = {PB1, PB0, PA1, PA0}; //A0, A1, A2, A3 + +// HID report descriptor using TinyUSB's template +// Single Report (no ID) descriptor +uint8_t const desc_hid_report[] = { + TUD_HID_REPORT_DESC_KEYBOARD() +}; + +// USB HID object. For ESP32 these values cannot be changed after this declaration +// desc report, desc len, protocol, interval, use out endpoint +Adafruit_USBD_HID usb_hid; + + +// number of pins +uint8_t pincount = sizeof(pins) / sizeof(pins[0]); + +// For keycode definition check out https://github.com/hathach/tinyusb/blob/master/src/class/hid/hid.h +uint8_t hidcode[] = {HID_KEY_0, HID_KEY_1, HID_KEY_2, HID_KEY_3}; + +bool activeState = false; + +// the setup function runs once when you press reset or power the board +void setup() { + pixels.begin(); + // Manual begin() is required on core without built-in support e.g. mbed rp2040 + if (!TinyUSBDevice.isInitialized()) { + TinyUSBDevice.begin(0); + } + + // Setup HID + usb_hid.setBootProtocol(HID_ITF_PROTOCOL_KEYBOARD); + usb_hid.setPollInterval(2); + usb_hid.setReportDescriptor(desc_hid_report, sizeof(desc_hid_report)); + usb_hid.setStringDescriptor("TinyUSB Keyboard"); + + // Set up output report (on control endpoint) for Capslock indicator + usb_hid.setReportCallback(NULL, hid_report_callback); + + usb_hid.begin(); + + // overwrite input pin with PIN_BUTTONx +#ifdef PIN_BUTTON1 + pins[0] = PIN_BUTTON1; +#endif + +#ifdef PIN_BUTTON2 + pins[1] = PIN_BUTTON2; +#endif + +#ifdef PIN_BUTTON3 + pins[2] = PIN_BUTTON3; +#endif + +#ifdef PIN_BUTTON4 + pins[3] = PIN_BUTTON4; +#endif + + // Set up pin as input + for (uint8_t i = 0; i < pincount; i++) { + pinMode(pins[i], activeState ? INPUT_PULLDOWN : INPUT_PULLUP); + } +} + +void process_hid() { + // used to avoid send multiple consecutive zero report for keyboard + static bool keyPressedPreviously = false; + + uint8_t count = 0; + uint8_t keycode[6] = {0}; + + // scan normal key and send report + for (uint8_t i = 0; i < pincount; i++) { + if (activeState == digitalRead(pins[i])) { + // if pin is active (low), add its hid code to key report + keycode[count++] = hidcode[i]; + + // 6 is max keycode per report + if (count == 6) break; + } + } + + if (TinyUSBDevice.suspended() && count) { + // Wake up host if we are in suspend mode + // and REMOTE_WAKEUP feature is enabled by host + TinyUSBDevice.remoteWakeup(); + } + + // skip if hid is not ready e.g still transferring previous report + if (!usb_hid.ready()) return; + + if (count) { + // Send report if there is key pressed + uint8_t const report_id = 0; + uint8_t const modifier = 0; + + keyPressedPreviously = true; + usb_hid.keyboardReport(report_id, modifier, keycode); + } else { + // Send All-zero report to indicate there is no keys pressed + // Most of the time, it is, though we don't need to send zero report + // every loop(), only a key is pressed in previous loop() + if (keyPressedPreviously) { + keyPressedPreviously = false; + usb_hid.keyboardRelease(0); + } + } +} + +void loop() { + #ifdef TINYUSB_NEED_POLLING_TASK + // Manual call tud_task since it isn't called by Core's background + TinyUSBDevice.task(); + #endif + + // not enumerated()/mounted() yet: nothing to do + if (!TinyUSBDevice.mounted()) { + return; + } + + // poll gpio once each 2 ms + static uint32_t ms = 0; + if (millis() - ms > 2) { + ms = millis(); + process_hid(); + } +} + +void setLED(bool state) { + pixels.setPixelColor(0, pixels.Color(0, state ? 150 : 0, 0)); + pixels.show(); +} + +// Output report callback for LED indicator such as Caplocks +void hid_report_callback(uint8_t report_id, hid_report_type_t report_type, uint8_t const* buffer, uint16_t bufsize) { + (void) report_id; + (void) bufsize; + + // LED indicator is output report with only 1 byte length + if (report_type != HID_REPORT_TYPE_OUTPUT) return; + + // The LED bit map is as follows: (also defined by KEYBOARD_LED_* ) + // Kana (4) | Compose (3) | ScrollLock (2) | CapsLock (1) | Numlock (0) + uint8_t ledIndicator = buffer[0]; + + // turn on LED if capslock is set + setLED(ledIndicator & KEYBOARD_LED_CAPSLOCK); +} diff --git a/QT_Py_CH32_Examples/I2C_Scan/.none.test.only b/QT_Py_CH32_Examples/I2C_Scan/.none.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/QT_Py_CH32_Examples/I2C_Scan/I2C_Scan.bin b/QT_Py_CH32_Examples/I2C_Scan/I2C_Scan.bin new file mode 100644 index 000000000..a8087a283 Binary files /dev/null and b/QT_Py_CH32_Examples/I2C_Scan/I2C_Scan.bin differ diff --git a/QT_Py_CH32_Examples/I2C_Scan/I2C_Scan.ino b/QT_Py_CH32_Examples/I2C_Scan/I2C_Scan.ino new file mode 100644 index 000000000..c43cc9a1c --- /dev/null +++ b/QT_Py_CH32_Examples/I2C_Scan/I2C_Scan.ino @@ -0,0 +1,81 @@ +// SPDX-FileCopyrightText: 2023 Carter Nelson for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +extern Adafruit_TestBed TB; + +#define DEFAULT_I2C_PORT &Wire + +// Some boards have TWO I2C ports, how nifty. We should scan both +#if defined(ARDUINO_ARCH_RP2040) \ + || defined(ARDUINO_ADAFRUIT_QTPY_ESP32S2) \ + || defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3_NOPSRAM) \ + || defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3) \ + || defined(ARDUINO_ADAFRUIT_QTPY_ESP32_PICO) \ + || defined(ARDUINO_SAM_DUE) \ + || defined(ARDUINO_ARCH_RENESAS_UNO) + #define SECONDARY_I2C_PORT &Wire1 +#endif + +void setup() { + Serial.begin(115200); + + // Wait for Serial port to open + while (!Serial) { + delay(10); + } + delay(500); + Serial.println("Adafruit I2C Scanner"); + +#if defined(ARDUINO_ADAFRUIT_QTPY_ESP32S2) || \ + defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3_NOPSRAM) || \ + defined(ARDUINO_ADAFRUIT_QTPY_ESP32S3) || \ + defined(ARDUINO_ADAFRUIT_QTPY_ESP32_PICO) + // ESP32 is kinda odd in that secondary ports must be manually + // assigned their pins with setPins()! + Wire1.setPins(SDA1, SCL1); +#endif + +#if defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2) + // turn on the I2C power by setting pin to opposite of 'rest state' + pinMode(PIN_I2C_POWER, INPUT); + delay(1); + bool polarity = digitalRead(PIN_I2C_POWER); + pinMode(PIN_I2C_POWER, OUTPUT); + digitalWrite(PIN_I2C_POWER, !polarity); +#endif + +#if defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2_TFT) + pinMode(TFT_I2C_POWER, OUTPUT); + digitalWrite(TFT_I2C_POWER, HIGH); +#endif + +#if defined(ARDUINO_ADAFRUIT_FEATHER_ESP32S2_REVTFT) + pinMode(TFT_I2C_POWER, OUTPUT); + digitalWrite(TFT_I2C_POWER, HIGH); +#endif + +#if defined(ADAFRUIT_FEATHER_ESP32_V2) + // Turn on the I2C power by pulling pin HIGH. + pinMode(NEOPIXEL_I2C_POWER, OUTPUT); + digitalWrite(NEOPIXEL_I2C_POWER, HIGH); +#endif +} + +void loop() { + Serial.println(""); + Serial.println(""); + + Serial.print("Default port (Wire) "); + TB.theWire = DEFAULT_I2C_PORT; + TB.printI2CBusScan(); + +#if defined(SECONDARY_I2C_PORT) + Serial.print("Secondary port (Wire1) "); + TB.theWire = SECONDARY_I2C_PORT; + TB.printI2CBusScan(); +#endif + + delay(3000); // wait 3 seconds +} diff --git a/QT_Py_CH32_Examples/Neopixel_QTPyCH32/.none.test.only b/QT_Py_CH32_Examples/Neopixel_QTPyCH32/.none.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/QT_Py_CH32_Examples/Neopixel_QTPyCH32/Neopixel_QTPyCH32.bin b/QT_Py_CH32_Examples/Neopixel_QTPyCH32/Neopixel_QTPyCH32.bin new file mode 100644 index 000000000..1081db2bf Binary files /dev/null and b/QT_Py_CH32_Examples/Neopixel_QTPyCH32/Neopixel_QTPyCH32.bin differ diff --git a/QT_Py_CH32_Examples/Neopixel_QTPyCH32/Neopixel_QTPyCH32.ino b/QT_Py_CH32_Examples/Neopixel_QTPyCH32/Neopixel_QTPyCH32.ino new file mode 100644 index 000000000..ebf81cfd5 --- /dev/null +++ b/QT_Py_CH32_Examples/Neopixel_QTPyCH32/Neopixel_QTPyCH32.ino @@ -0,0 +1,29 @@ +// SPDX-FileCopyrightText: 2024 ladyada for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include // required for USB Serial +#include + +const int neopixel_pin = PA4; +#define LED_COUNT 1 +Adafruit_NeoPixel pixels(LED_COUNT, neopixel_pin, NEO_GRB + NEO_KHZ800); + +void setup () { + pixels.begin(); +} + +uint16_t firstPixelHue = 0; + +void loop() { + firstPixelHue += 256; + for(int i=0; i + +uint8_t count = 0; +uint8_t state = 0; + +void setup() { + while (!USBSerial()); // wait for serial port to connect. Needed for native USB port only + delay(100); + USBSerial_println("QT Py CH552 Cap Touch Test"); + USBSerial_println("Uses pin A0 (P1.1)"); + TouchKey_begin((1 << 1)); //Enable channel P1.1/A0 +} + +void loop() { + // put your main code here, to run repeatedly: + TouchKey_Process(); + uint8_t touchResult = TouchKey_Get(); + if (touchResult) { + if (state == 0) { + count += 1; + state = 1; + USBSerial_print("TIN1.1 touched "); + USBSerial_print(count); + USBSerial_println(" times"); + } + } else { + state = 0; + } + delay(1000); + +} diff --git a/QT_Py_CH552_Examples/I2C_AHT20_QTPyCH552/.none.test.only b/QT_Py_CH552_Examples/I2C_AHT20_QTPyCH552/.none.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/QT_Py_CH552_Examples/I2C_AHT20_QTPyCH552/I2C_AHT20_QTPyCH552.ino b/QT_Py_CH552_Examples/I2C_AHT20_QTPyCH552/I2C_AHT20_QTPyCH552.ino new file mode 100644 index 000000000..053c51995 --- /dev/null +++ b/QT_Py_CH552_Examples/I2C_AHT20_QTPyCH552/I2C_AHT20_QTPyCH552.ino @@ -0,0 +1,165 @@ +// SPDX-FileCopyrightText: 2024 ladyada for Adafruit Industries +// +// SPDX-License-Identifier: MIT +// https://chat.openai.com/share/5dddee44-3196-4a6b-b445-58ac6ef18501 + +#include + +extern uint8_t scl_pin; +extern uint8_t sda_pin; + +void Wire_begin(uint8_t scl, uint8_t sda); +bool Wire_scan(uint8_t i2caddr); +bool Wire_writeBytes(uint8_t i2caddr, uint8_t *data, uint8_t bytes); +bool Wire_readBytes(uint8_t i2caddr, uint8_t *data, uint8_t bytes); +bool Wire_readRegister(uint8_t i2caddr, uint8_t regaddr, uint8_t *data, uint8_t bytes); + +bool readAHT20(float *temperature, float *humidity); +#define AHTX0_I2CADDR_DEFAULT 0x38 + +void setup() { + while (!USBSerial()); // wait for serial port to connect. Needed for native USB port only + delay(100); + + USBSerial_println("CH552 QT Py I2C sensor test"); + Wire_begin(33, 34); // set up I2C on CH552 QT Py + + USBSerial_print("I2C Scan: "); + for (uint8_t a=0; a<=0x7F; a++) { + if (!Wire_scan(a)) continue; + USBSerial_print("0x"); + USBSerial_print(a, HEX); + USBSerial_print(", "); + } + USBSerial_println(); + + if (! Wire_scan(AHTX0_I2CADDR_DEFAULT)) { + USBSerial_println("No AHT20 found!"); + while (1); + } +} + +void loop() { + delay(100); + + float t, h; + if (!readAHT20(&t, &h)) { + USBSerial_println("Failed to read from AHT20"); + } + USBSerial_print("Temp: "); + USBSerial_print(t); + USBSerial_print(" *C, Hum: "); + USBSerial_print(h); + USBSerial_println(" RH%"); +} + +/*********************** AHT20 'driver */ + +#define AHTX0_CMD_TRIGGER 0xAC +#define AHTX0_STATUS_BUSY 0x80 + +bool AHT20_getStatus(uint8_t *status) { + return Wire_readBytes(AHTX0_I2CADDR_DEFAULT, status, 1); +} + +bool readAHT20(float *temperature, float *humidity) { + uint8_t cmd[3] = {AHTX0_CMD_TRIGGER, 0x33, 0x00}; + uint8_t data[6], status; + uint32_t rawHumidity, rawTemperature; + + // Trigger AHT20 measurement + if (!Wire_writeBytes(AHTX0_I2CADDR_DEFAULT, cmd, 3)) { + return false; + } + + // Wait until the sensor is no longer busy + do { + if (!AHT20_getStatus(&status)) { + return false; + } + delay(10); // Delay 10ms to wait for measurement + } while (status & AHTX0_STATUS_BUSY); + + // Read the measurement data + if (!Wire_readBytes(AHTX0_I2CADDR_DEFAULT, data, 6)) { + return false; + } + + // Parse humidity data + rawHumidity = data[1]; + rawHumidity = (rawHumidity << 8) | data[2]; + rawHumidity = (rawHumidity << 4) | (data[3] >> 4); + *humidity = ((float)rawHumidity * 100.0) / 0x100000; + + // Parse temperature data + rawTemperature = (data[3] & 0x0F); + rawTemperature = (rawTemperature << 8) | data[4]; + rawTemperature = (rawTemperature << 8) | data[5]; + *temperature = ((float)rawTemperature * 200.0 / 0x100000) - 50.0; + + return true; +} + +/**************************** Wire I2C interface */ + +void Wire_begin(uint8_t scl, uint8_t sda) { + scl_pin = scl; //extern variable in SoftI2C.h + sda_pin = sda; + I2CInit(); +} + +bool Wire_scan(uint8_t i2caddr) { + return Wire_writeBytes(i2caddr, NULL, 0); +} + +bool Wire_readRegister(uint8_t i2caddr, uint8_t regaddr, uint8_t *data, uint8_t bytes) { + if (!Wire_writeBytes(i2caddr, ®addr, 1)) { + return false; + } + + return Wire_readBytes(i2caddr, data, bytes); +} + + +bool Wire_writeBytes(uint8_t i2caddr, uint8_t *data, uint8_t bytes) { + uint8_t ack_bit; + + I2CStart(); + ack_bit = I2CSend(i2caddr << 1 | 0); // Shift address and append write bit + if (ack_bit != 0) { + I2CStop(); + return false; + } + + for (uint8_t i = 0; i < bytes; i++) { + if (I2CSend(data[i]) != 0) { + I2CStop(); + return false; + } + } + I2CStop(); + return true; +} + +bool Wire_readBytes(uint8_t i2caddr, uint8_t *data, uint8_t bytes) { + uint8_t ack_bit; + + I2CStart(); + ack_bit = I2CSend(i2caddr << 1 | 1); // Shift address and append read bit + if (ack_bit != 0) { + I2CStop(); + return false; + } + + for (uint8_t i = 0; i < bytes; i++) { + data[i] = I2CRead(); + if (i == bytes - 1) { + I2CNak(); // NAK on last byte + } else { + I2CAck(); // ACK on other bytes + } + } + + I2CStop(); + return true; +} diff --git a/QT_Py_CH552_Examples/Neopixel_QTPyCH552/.none.test.only b/QT_Py_CH552_Examples/Neopixel_QTPyCH552/.none.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/QT_Py_CH552_Examples/Neopixel_QTPyCH552/Neopixel_QTPyCH552.ino b/QT_Py_CH552_Examples/Neopixel_QTPyCH552/Neopixel_QTPyCH552.ino new file mode 100644 index 000000000..5047c0e21 --- /dev/null +++ b/QT_Py_CH552_Examples/Neopixel_QTPyCH552/Neopixel_QTPyCH552.ino @@ -0,0 +1,97 @@ +// SPDX-FileCopyrightText: 2024 ladyada for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +#define NEOPIXEL_PIN P1_0 +#define NUM_LEDS 1 + +#define COLOR_PER_LEDS 3 +#define NUM_BYTES (NUM_LEDS*COLOR_PER_LEDS) +#if NUM_BYTES > 255 +#error "NUM_BYTES can not be larger than 255." +#endif +__xdata uint8_t ledData[NUM_BYTES]; + +/***********************************************************************/ +uint8_t neopixel_brightness = 255; +uint32_t Wheel(byte WheelPos); +void rainbowCycle(uint8_t wait); + +#define NEOPIXEL_SHOW_FUNC CONCAT(neopixel_show_, NEOPIXEL_PIN) + +void neopixel_begin() { + pinMode(NEOPIXEL_PIN, OUTPUT); //Possible to use other pins. +} + +void neopixel_show() { + NEOPIXEL_SHOW_FUNC(ledData, NUM_BYTES); //Possible to use other pins. +} + +void neopixel_setPixelColor(uint8_t i, uint32_t c) { + uint16_t r, g, b; + r = (((c >> 16) & 0xFF) * neopixel_brightness) >> 8; + g = (((c >> 8) & 0xFF) * neopixel_brightness) >> 8; + b = ((c & 0xFF) * neopixel_brightness) >> 8; + + set_pixel_for_GRB_LED(ledData, i, r, g, b); +} + +void neopixel_setBrightness(uint8_t b) { + neopixel_brightness = b; +} +/***********************************************************************/ + + +void setup() { + neopixel_begin(); + neopixel_setBrightness(50); +} + +void loop() { + rainbowCycle(5); +} + + +void rainbowCycle(uint8_t wait) { + uint8_t i, j; + + for (j=0; j<255; j++) { + for (i=0; i < NUM_LEDS; i++) { + neopixel_setPixelColor(i, Wheel(((i * 256 / NUM_LEDS) + j) & 255)); + } + neopixel_show(); + delay(wait); + } +} + + +// Input a value 0 to 255 to get a color value. +// The colours are a transition r - g - b - back to r. +uint32_t Wheel(byte WheelPos) { + uint8_t r, g, b; + uint32_t c; + + if(WheelPos < 85) { + r = WheelPos * 3; + g = 255 - WheelPos * 3 ; + b = 0; + } else if(WheelPos < 170) { + WheelPos -= 85; + r = 255 - WheelPos * 3; + g = 0; + b = WheelPos * 3; + } else { + WheelPos -= 170; + r = 0; + g = WheelPos * 3; + b = 255 - WheelPos * 3; + } + c = r; + c <<= 8; + c |= g; + c <<= 8; + c |= b; + return c; +} diff --git a/QT_Py_CH552_Examples/analogIn_QTPyCH552/.none.test.only b/QT_Py_CH552_Examples/analogIn_QTPyCH552/.none.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/QT_Py_CH552_Examples/analogIn_QTPyCH552/analogIn_QTPyCH552.ino b/QT_Py_CH552_Examples/analogIn_QTPyCH552/analogIn_QTPyCH552.ino new file mode 100644 index 000000000..00cfb7c27 --- /dev/null +++ b/QT_Py_CH552_Examples/analogIn_QTPyCH552/analogIn_QTPyCH552.ino @@ -0,0 +1,47 @@ +// SPDX-FileCopyrightText: 2024 ladyada for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/* + ReadAnalogVoltage + + Reads an analog input on pin P1.1, converts it to voltage, and prints the result to the Serial Monitor. + Graphical representation is available using Serial Plotter (Tools > Serial Plotter menu). + Attach the center pin of a potentiometer to pin P1.1, and the outside pins to +5V and ground. + + This example code is in the public domain. + + http://www.arduino.cc/en/Tutorial/ReadAnalogVoltage +*/ + +#include + +#define A0 11 +#define A1 14 +#define A2 15 // also MISO! +#define A3 32 + +#define ANALOG_IN A3 +#define VREF 3.3 + +// the setup routine runs once when you press reset: +void setup() { + // No need to init USBSerial + + // By default 8051 enable every pin's pull up resistor. Disable pull-up to get full input range. + pinMode(ANALOG_IN, INPUT); +} + +// the loop routine runs over and over again forever: +void loop() { + // read the input on analog pin 0, P1.1: + int sensorValue = analogRead(ANALOG_IN); + // Convert the analog reading (which goes from 0 - 255) to VREF: + float voltage = sensorValue * (VREF / 255.0); + // print out the value you read: + USBSerial_println(voltage); + // or with precision: + //USBSerial_println(voltage,1); + + delay(10); +} diff --git a/QT_Py_Media_Controller/code.py b/QT_Py_Media_Controller/code.py new file mode 100644 index 000000000..648dd98fd --- /dev/null +++ b/QT_Py_Media_Controller/code.py @@ -0,0 +1,66 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import board +import usb_hid +import neopixel +from rainbowio import colorwheel +from adafruit_debouncer import Button +from adafruit_seesaw import seesaw, rotaryio, digitalio +from adafruit_hid.consumer_control import ConsumerControl +from adafruit_hid.consumer_control_code import ConsumerControlCode +from adafruit_hid.keyboard import Keyboard +from adafruit_hid.keycode import Keycode + +enc_inc = ConsumerControlCode.VOLUME_INCREMENT +enc_dec = ConsumerControlCode.VOLUME_DECREMENT +one_press = ConsumerControlCode.PLAY_PAUSE +two_press = ConsumerControlCode.SCAN_NEXT_TRACK +three_press = [Keycode.LEFT_CONTROL, Keycode.UP_ARROW] +long_press = ConsumerControlCode.MUTE + +cc = ConsumerControl(usb_hid.devices) +kbd = Keyboard(usb_hid.devices) + +pixel_pin = board.A1 +num_pixels = 18 +pixels = neopixel.NeoPixel(pixel_pin, num_pixels, + brightness=.5, auto_write=True) +hue = 0 +pixels.fill(colorwheel(hue)) + +i2c = board.STEMMA_I2C() +seesaw = seesaw.Seesaw(i2c, 0x36) +seesaw.pin_mode(24, seesaw.INPUT_PULLUP) +ss_pin = digitalio.DigitalIO(seesaw, 24) +button = Button(ss_pin, long_duration_ms=600) + +encoder = rotaryio.IncrementalEncoder(seesaw) +last_position = 0 + +while True: + position = -encoder.position + button.update() + if position != last_position: + if position > last_position: + cc.send(enc_dec) + hue = hue - 7 + if hue <= 0: + hue = hue + 256 + else: + cc.send(enc_inc) + hue = hue + 7 + if hue >= 256: + hue = hue - 256 + pixels.fill(colorwheel(hue)) + last_position = position + if button.short_count == 1: + cc.send(one_press) + if button.short_count == 2: + cc.send(two_press) + if button.short_count == 3: + kbd.press(*three_press) + kbd.release_all() + if button.long_press: + cc.send(long_press) diff --git a/Qualia/Qualia_S3_1D_Chomper_Game/code.py b/Qualia/Qualia_S3_1D_Chomper_Game/code.py index ebae93b5a..78693024b 100644 --- a/Qualia/Qualia_S3_1D_Chomper_Game/code.py +++ b/Qualia/Qualia_S3_1D_Chomper_Game/code.py @@ -9,8 +9,7 @@ Circuitpython based 1 dimensional pacman style game inspired by Paku Paku. import board from adafruit_qualia import Qualia from adafruit_qualia.graphics import Displays -from entity import Entity -from chomper_1d_lib import ChomperGame +from chomper_1d_lib import ChomperGame, Entity from digitalio import DigitalInOut, Direction, Pull diff --git a/Qualia/Qualia_S3_Theme_Park_Display/Roboto-Regular-47.pcf b/Qualia/Qualia_S3_Theme_Park_Display/Roboto-Regular-47.pcf new file mode 100644 index 000000000..ec0386846 Binary files /dev/null and b/Qualia/Qualia_S3_Theme_Park_Display/Roboto-Regular-47.pcf differ diff --git a/Qualia/Qualia_S3_Theme_Park_Display/code.py b/Qualia/Qualia_S3_Theme_Park_Display/code.py new file mode 100644 index 000000000..bbfd08af1 --- /dev/null +++ b/Qualia/Qualia_S3_Theme_Park_Display/code.py @@ -0,0 +1,137 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import os +import ssl +import time +import microcontroller +import wifi +import socketpool +import adafruit_requests +import board +import displayio +import keypad +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff +from adafruit_display_text import outlined_label +from adafruit_bitmap_font import bitmap_font +from adafruit_qualia.graphics import Graphics, Displays + +urls = [{'name': "Epcot", + 'url': "https://queue-times.com/en-US/parks/5/queue_times.json"}, + {'name': "Magic Kingdom", + 'url': "https://queue-times.com/en-US/parks/6/queue_times.json"}, + {'name': "Hollywood Studios", + 'url': "https://queue-times.com/en-US/parks/7/queue_times.json"}, + {'name': "Animal Kingdom", + 'url': "https://queue-times.com/en-US/parks/8/queue_times.json"}, + ] +bitmap = displayio.OnDiskBitmap("/park-bg.bmp") + +key = keypad.Keys((board.A0,), value_when_pressed=False, pull=True) + +wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD")) +print(f"Connected to {os.getenv('CIRCUITPY_WIFI_SSID')}") + +context = ssl.create_default_context() +pool = socketpool.SocketPool(wifi.radio) +requests = adafruit_requests.Session(pool, context) + +graphics = Graphics(Displays.ROUND40, default_bg=None, auto_refresh=True) + +grid = displayio.TileGrid(bitmap, pixel_shader=bitmap.pixel_shader) +group = displayio.Group() +group.append(grid) + +font = bitmap_font.load_font("/Roboto-Regular-47.pcf") +ride_text = [] +wait_text = [] +for i in range(5): + text_ride = outlined_label.OutlinedLabel(font, text=" ", + outline_color=0x000000, + outline_size=3, + padding_left=4, + padding_right=4, + padding_top=4, + padding_bottom=4) + ride_text.append(text_ride) + text_wait = outlined_label.OutlinedLabel(font, text=" ", + outline_color=0x000000, + outline_size=3, + padding_left=4, + padding_right=4, + padding_top=4, + padding_bottom=4) + wait_text.append(text_wait) + group.append(text_ride) + group.append(text_wait) + +text_park = outlined_label.OutlinedLabel(font, text=urls[0]['name'], + outline_color = 0x000000, + outline_size=3, + padding_left=4, + padding_right=4, + padding_top=4, + padding_bottom=4) +text_park.x = (graphics.display.width - text_park.width) // 2 +text_park.y = graphics.display.height - (text_park.height * 2) +group.append(text_park) + +def center(g, b): + # center the image + g.x -= (b.width - graphics.display.width) // 2 + g.y -= (b.height - graphics.display.height) // 2 + +center(grid, bitmap) + +graphics.display.root_group = group + +def sort_rides(data): + y = 30 + x = [135, 55, 15, 25, 45] + all_rides = [] + for land in data['lands']: + all_rides.extend(land['rides']) + sorted_rides = sorted(all_rides, key=lambda x: x['wait_time'], reverse=True) + for ride in sorted_rides: + r = sorted_rides.index(ride) + if r > 4: + break + #print(wait_text[r]) + ride_text[r].text = f"{ride['name']:.20}" + if len(ride['name']) > 20: + ride_text[r].text = ride_text[r].text + ".." + ride_text[r].x = x[r] + ride_text[r].y = y + 70 + wait_text[r].text = f"{ride['wait_time']} Minutes" + wait_text[r].x = 400 + wait_text[r].y = ride_text[r].y + wait_text[r].height + 20 + y += wait_text[r].height * 2 + 30 + +clock_timer = 5 * 60 * 1000 +clock_clock = ticks_ms() +park_index = 0 +update = True + +while True: + try: + event = key.events.get() + if event: + if event.pressed: + print("updating display") + park_index = (park_index + 1) % len(urls) + text_park.text=urls[park_index]['name'] + text_park.x = (graphics.display.width - text_park.width) // 2 + text_park.y = graphics.display.height - (text_park.height * 2) + update = True + if ticks_diff(ticks_ms(), clock_clock) >= clock_timer or update: + response = requests.get(urls[park_index]['url']) + # packs the response into a JSON + response_data = response.json() + sort_rides(response_data) + update = False + clock_clock = ticks_add(clock_clock, clock_timer) + except Exception as error: # pylint: disable=broad-except + print(f"error! {error} resetting..") + time.sleep(5) + microcontroller.reset() diff --git a/Qualia/Qualia_S3_Theme_Park_Display/park-bg.bmp b/Qualia/Qualia_S3_Theme_Park_Display/park-bg.bmp new file mode 100644 index 000000000..94e1e2135 Binary files /dev/null and b/Qualia/Qualia_S3_Theme_Park_Display/park-bg.bmp differ diff --git a/Qualia/Qualia_S3_iOS_Photo_Frame/code.py b/Qualia/Qualia_S3_iOS_Photo_Frame/code.py new file mode 100644 index 000000000..9654e3b7e --- /dev/null +++ b/Qualia/Qualia_S3_iOS_Photo_Frame/code.py @@ -0,0 +1,104 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import os +import ssl +import io +import binascii +import jpegio +import microcontroller +import wifi +import socketpool +import displayio +from adafruit_qualia.graphics import Graphics, Displays +import adafruit_minimqtt.adafruit_minimqtt as MQTT + +aio_username = os.getenv("ADAFRUIT_AIO_USERNAME") +aio_key = os.getenv("ADAFRUIT_AIO_KEY") + +print(f"Connecting to {os.getenv('CIRCUITPY_WIFI_SSID')}") +wifi.radio.connect(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD")) +print(f"Connected to {os.getenv('CIRCUITPY_WIFI_SSID')}!") + +camera_feed = aio_username + "/feeds/camera" + +graphics = Graphics(Displays.ROUND40, default_bg=None, auto_refresh=True) + +def center(g, b): + # center the image + g.x -= ((b.width * 2) - 720) // 4 + g.y -= ((b.height * 2) - 720) // 4 + +def decode_image(base64_msg): + # Decode the base64 image into raw binary JPEG data + decoded_image = binascii.a2b_base64(base64_msg) + # Create a JpegDecoder instance + decoder = jpegio.JpegDecoder() + # Use io.BytesIO to treat the decoded image as a file-like object + jpeg_data = io.BytesIO(decoded_image) + # Open the JPEG data source from the BytesIO object + width, height = decoder.open(jpeg_data) + print(width, height) + # Create a Bitmap with the dimensions of the JPEG image + bitmap = displayio.Bitmap(width, height, 65536) # Use 65536 colors for RGB565 + # Decode the JPEG into the bitmap + decoder.decode(bitmap) + # pylint: disable=line-too-long + grid = displayio.TileGrid(bitmap, pixel_shader=displayio.ColorConverter(input_colorspace=displayio.Colorspace.RGB565_SWAPPED)) + center(grid, bitmap) + group = displayio.Group(scale=2) + group.append(grid) + graphics.display.root_group = group + graphics.display.refresh() + + +# Define callback methods which are called when events occur +def connected(client, userdata, flags, rc): # pylint: disable=unused-argument + # This function will be called when the client is connected + # successfully to the broker. + print(f"Connected to Adafruit IO! Listening for topic changes on {camera_feed}") + # Subscribe to all changes on the onoff_feed. + client.subscribe(camera_feed) + + +def disconnected(client, userdata, rc): # pylint: disable=unused-argument + # This method is called when the client is disconnected + print("Disconnected from Adafruit IO!") + + +def message(client, topic, msg): # pylint: disable=unused-argument + # This method is called when a topic the client is subscribed to + # has a new message. + print(f"New message on topic {topic}") + decode_image(msg) + +pool = socketpool.SocketPool(wifi.radio) +ssl_context = ssl.create_default_context() +# Initialize an Adafruit IO HTTP API object +mqtt_client = MQTT.MQTT( + broker="io.adafruit.com", + port=1883, + username=aio_username, + password=aio_key, + socket_pool=pool, + ssl_context=ssl_context, +) +# Setup the callback methods above +mqtt_client.on_connect = connected +mqtt_client.on_disconnect = disconnected +mqtt_client.on_message = message + +# Connect the client to the MQTT broker. +print("Connecting to Adafruit IO...") +mqtt_client.connect() +while True: + # Poll the message queue + try: + mqtt_client.loop(timeout=1) + time.sleep(5) + except Exception as error: # pylint: disable=broad-except + print(error) + time.sleep(5) + microcontroller.reset() diff --git a/RP2040_PiCowbell_Timelapse/Helvetica-Bold-16.pcf b/RP2040_PiCowbell_Timelapse/Helvetica-Bold-16.pcf new file mode 100644 index 000000000..deb9092d1 Binary files /dev/null and b/RP2040_PiCowbell_Timelapse/Helvetica-Bold-16.pcf differ diff --git a/RP2040_PiCowbell_Timelapse/code.py b/RP2040_PiCowbell_Timelapse/code.py new file mode 100644 index 000000000..969bffb9a --- /dev/null +++ b/RP2040_PiCowbell_Timelapse/code.py @@ -0,0 +1,234 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import os +import time +import gc +import microcontroller +import digitalio +import sdcardio +import storage +import board +import busio +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff +import displayio +from adafruit_neokey.neokey1x4 import NeoKey1x4 +import adafruit_st7789 +from adafruit_display_text import label +from adafruit_bitmap_font import bitmap_font +import adafruit_ov5640 + +gc.collect() +# Release any resources currently in use for the displays +displayio.release_displays() +gc.collect() +print("Initializing SD card") +spi = busio.SPI(clock=board.GP18, MOSI=board.GP19, MISO=board.GP16) +sd_cs = board.GP17 +sdcard = sdcardio.SDCard(spi, sd_cs) +vfs = storage.VfsFat(sdcard) +storage.mount(vfs, "/sd") +gc.collect() +i2c = busio.I2C(board.GP5, board.GP4) +tft_cs = board.GP21 +tft_dc = board.GP20 +display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs, reset=None) +display = adafruit_st7789.ST7789(display_bus, width=240, height=240, rowstart=80, rotation=0) + +gc.collect() +splash = displayio.Group() +display.root_group = splash + +gc.collect() +font = bitmap_font.load_font("Helvetica-Bold-16.pcf") +t2 = label.Label(font, text="Start?", color=(255, 255, 255)) +t2.anchor_point = (0.5, 0.0) +t2.anchored_position = (display.width / 2, 0) +splash.append(t2) +t1 = label.Label(font, text="Interval: 3s", color=(255, 255, 255)) +t1.anchor_point = (0.5, 1.0) +t1.anchored_position = (display.width / 2, display.height) +splash.append(t1) + +print("construct camera") +gc.collect() +reset = digitalio.DigitalInOut(board.GP14) +cam = adafruit_ov5640.OV5640( + i2c, + data_pins=( + board.GP6, + board.GP7, + board.GP8, + board.GP9, + board.GP10, + board.GP11, + board.GP12, + board.GP13, + ), + clock=board.GP3, + vsync=board.GP0, + href=board.GP2, + mclk=None, + shutdown=None, + reset=reset, + size=adafruit_ov5640.OV5640_SIZE_QCIF, +) +print("print chip id") +print(cam.chip_id) +gc.collect() +cam.quality = 3 +gc.collect() + +def exists(filename): + try: + os.stat(filename) + return True + except OSError as _: + return False + +_image_counter = 0 + +def open_next_image(): + global _image_counter # pylint: disable=global-statement + while True: + filename = f"/sd/img{_image_counter:04d}.jpg" + _image_counter += 1 + if exists(filename): + continue + print("# writing to", filename) + return open(filename, "wb") + +cam.colorspace = adafruit_ov5640.OV5640_COLOR_RGB +gc.collect() + +bitmap = displayio.Bitmap(cam.width, cam.height, 65535) +if bitmap is None: + raise SystemExit("Could not allocate a bitmap") + +tg = displayio.TileGrid(bitmap, + pixel_shader=displayio.ColorConverter(input_colorspace=displayio.Colorspace.RGB565_SWAPPED), + x=int((display.width - bitmap.width) / 2), y=int((display.height - bitmap.height) / 2) +) +splash.append(tg) +gc.collect() + +# Create a NeoKey object +neokey = NeoKey1x4(i2c, addr=0x30) +# states for key presses +key_0_state = False +key_1_state = False +key_2_state = False +key_3_state = False + +tm0 = time.monotonic_ns() +display.auto_refresh = False +mode = 0 +intervals = [3, 5, 10, 30, 60] +index = 0 +clock = ticks_ms() +count = 0 +b = bytearray() +while True: + if mode == 0: # preview + cam.capture(bitmap) + bitmap.dirty() + display.refresh(minimum_frames_per_second=0) + tm1 = time.monotonic_ns() + # print("fps", 1e9 / (t1 - t0)) + tm0 = tm1 + if mode == 1: # timelapse + if ticks_diff(ticks_ms(), clock) >= intervals[index]*1000: + gc.collect() + time.sleep(0.01) + jpeg = cam.capture(b) + # print(f"Captured {len(jpeg)} bytes of jpeg data") + print(f" (had allocated {cam.capture_buffer_size} bytes") + print(f"Resolution {cam.width}x{cam.height}") + try: + with open_next_image() as f: + f.write(jpeg) + print("# Wrote image") + except OSError as e: + print(e) + count += 1 + t2.text = f"Timelapsing! {count} photos taken" + display.refresh(minimum_frames_per_second=0) + clock = ticks_add(clock, intervals[index]*1000) + if not neokey[0] and key_0_state: + key_0_state = False + neokey.pixels[0] = 0x0 + if not neokey[1] and key_1_state: + key_1_state = False + neokey.pixels[1] = 0x0 + if not neokey[2] and key_2_state: + key_2_state = False + neokey.pixels[2] = 0x0 + if not neokey[3] and key_3_state: + key_3_state = False + neokey.pixels[3] = 0x0 + # if 1st neokey is pressed... + if neokey[0] and not key_0_state: + mode = 1 + print("Button A") + # turn on NeoPixel + neokey.pixels[0] = 0xFF0000 + time.sleep(.2) + try: + del bitmap + del tg + except KeyError: + continue + gc.collect() + #cam.size=adafruit_ov5640.OV5640_SIZE_VGA + cam.colorspace = adafruit_ov5640.OV5640_COLOR_JPEG + b = bytearray(cam.capture_buffer_size) + t1.text=f"Taking photos every {intervals[index]}s" + clock = ticks_ms() + key_0_state = True + + # if 2nd neokey is pressed...change interval + if neokey[1] and not key_1_state: + print("Button B") + # turn on NeoPixel + neokey.pixels[1] = 0xFFFF00 + time.sleep(.2) + index = (index + 1) % len(intervals) + t1.text=f"Interval: {intervals[index]}s" + key_1_state = True + + # if 3rd neokey is pressed...autofocus + if neokey[2] and not key_2_state: + print("Button C") + # turn on NeoPixel + neokey.pixels[2] = 0x00FF00 + time.sleep(.2) + t2.text = "Autofocusing.." + try: + display.refresh(minimum_frames_per_second=0) + cam.autofocus() + except AttributeError: + print("This camera module does not have autofocus..") + continue + key_2_state = True + + # if 4th neokey is pressed...stop timelapse & reboot + if neokey[3] and not key_3_state: + print("Button D") + # turn on NeoPixel + neokey.pixels[3] = 0x00FFFF + time.sleep(.2) + gc.collect() + del b + gc.collect() + t2.text = "Ending timelapse.." + t1.text = f"Took {count} photos" + display.refresh(minimum_frames_per_second=0) + print("resetting..") + time.sleep(5) + del t1 + del t2 + gc.collect() + neokey.pixels[3] = 0x000000 + microcontroller.reset() + key_3_state = True diff --git a/RP2350_HSTX_Video_Synth/code.py b/RP2350_HSTX_Video_Synth/code.py new file mode 100644 index 000000000..43a37ad0b --- /dev/null +++ b/RP2350_HSTX_Video_Synth/code.py @@ -0,0 +1,568 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +# FFT calculations based on Phil B.'s Audio Spectrum Light Show Code +# https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/main/ +# Feather_Sense_Audio_Visualizer_13x9_RGB_LED_Matrix/audio_spectrum_lightshow/code.py +import gc +from array import array +from math import log +from random import randint +import board +from audiobusio import PDMIn +import displayio +import picodvi +import framebufferio +import vectorio +from rainbowio import colorwheel +import adafruit_imageload +from adafruit_display_shapes.line import Line +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff +from adafruit_seesaw import seesaw, rotaryio, digitalio +from analogio import AnalogIn +import simpleio +from ulab import numpy as np +try: + from ulab.utils import spectrogram +except ImportError: + from ulab.scipy.signal import spectrogram + +# ------ POTENTIOMETER SETUP ------ +pot1 = AnalogIn(board.A1) +pot2 = AnalogIn(board.A2) +pot3 = AnalogIn(board.A3) +read_pots = True +# ------ POTENTIOMETER MODE VALUES ------ +mode0_values = [0, 0, 0] +mode1_values = [0, 0, 0] +mode2_values = [0, 0, 0] +mode_vals = [mode0_values, mode1_values, mode2_values] +# ------ POTENTIOMETER READ FUNCTION ------ +def val(pin): + return pin.value + +# ------ SEESAW ENCODER ------ +i2c = board.STEMMA_I2C() +seesaw = seesaw.Seesaw(i2c, addr=0x36) +seesaw_product = (seesaw.get_version() >> 16) & 0xFFFF +print("Found product {}".format(seesaw_product)) +if seesaw_product != 4991: + print("Wrong firmware loaded? Expected 4991") +seesaw.pin_mode(24, seesaw.INPUT_PULLUP) +button = digitalio.DigitalIO(seesaw, 24) +button_held = False +encoder = rotaryio.IncrementalEncoder(seesaw) +last_position = 0 + +# ------ SHARED VARIABLES ------ +fft_size = 512 +low_bin = 15 +high_bin = 75 +low_band = (15, 75) +mid_band = (100, 120) +spectrum_size = fft_size // 2 +spectrum_bits = log(spectrum_size, 2) +mode = 0 +new_mode = True +states = {} + +# ------ PICODVI SETUP ------ +displayio.release_displays() +fb = picodvi.Framebuffer(320, 240, clk_dp=board.CKP, clk_dn=board.CKN, + red_dp=board.D0P, red_dn=board.D0N, + green_dp=board.D1P, green_dn=board.D1N, + blue_dp=board.D2P, blue_dn=board.D2N, + color_depth=8) +display = framebufferio.FramebufferDisplay(fb, auto_refresh=False) + +# ------ PDM MIC ------ +mic = PDMIn(board.D5, board.D6, sample_rate=44100, bit_depth=16) +rec_buf = array("H", [0] * fft_size) + +# pylint: disable=too-many-locals, global-statement, too-many-statements, global-variable-not-assigned + +# ------ INITIALIZE BAR GRAPH ANIMATION ------ +def initialize_bars(): + # based on Phil B.'s Audio Spectrum Light Show Code + # https://github.com/adafruit/Adafruit_Learning_System_Guides/blob/main/ + # Feather_Sense_Audio_Visualizer_13x9_RGB_LED_Matrix/audio_spectrum_lightshow/code.py + global states + spectrum_group = displayio.Group() + display.root_group = spectrum_group + + low_frac = log(low_bin, 2) / spectrum_bits + frac_range = log(high_bin, 2) / spectrum_bits - low_frac + num_columns = 16 + column_width = display.width // num_columns + column_table = [] + moving_avg_buffer = [display.height] * num_columns + smoothing_factor = 0.5 + height_multiplier = 5 + dynamic_level = 10 + noise_floor = 3.1 + + for column in range(num_columns): + lower = low_frac + frac_range * (column / num_columns * 0.95) + upper = low_frac + frac_range * ((column + 1) / num_columns) + mid = (lower + upper) * 0.5 + half_width = (upper - lower) * 0.5 + first_bin = int(2 ** (spectrum_bits * lower) + 1e-4) + last_bin = int(2 ** (spectrum_bits * upper) + 1e-4) + bin_weights = [] + for bin_index in range(first_bin, last_bin + 1): + bin_center = log(bin_index + 0.5, 2) / spectrum_bits + dist = abs(bin_center - mid) / half_width + if dist < 1.0: + dist = 1.0 - dist + bin_weights.append(((3.0 - (dist * 2.0)) * dist) * dist) + total = sum(bin_weights) + bin_weights = [ + (weight / total) * (0.8 + idx / num_columns * 1.4) + for idx, weight in enumerate(bin_weights) + ] + column_table.append( + [ + first_bin - low_bin, + bin_weights, + colorwheel(225 * column / num_columns), + display.height, + 0.0, + ] + ) + bar_pal = displayio.Palette(1) + bar_pal[0] = colorwheel(225 * column / num_columns) + rect = vectorio.Rectangle( + pixel_shader=bar_pal, + width=column_width, + height=1, + x=column * column_width, + y=display.height, + ) + spectrum_group.append(rect) + + peak_palette = displayio.Palette(1) + peak_palette[0] = 0x808080 + for column in range(num_columns): + column_table[column].append(display.height) + column_table[column].append(0.0) + peak_dot = vectorio.Rectangle( + pixel_shader=peak_palette, + width=column_width, + height=5, + x=column * column_width, + y=display.height, + ) + spectrum_group.append(peak_dot) + + states = { + "spectrum_group": spectrum_group, + "column_table": column_table, + "moving_avg_buffer": moving_avg_buffer, + "smoothing_factor": smoothing_factor, + "height_multiplier": height_multiplier, + "dynamic_level": dynamic_level, + "noise_floor": noise_floor, + "num_columns": num_columns, + "column_width": column_width, + "peak_pal": peak_palette, + } + +# ------ BAR GRAPH ANIMATION ------ +def bars(pos, read): + global states + if read: + states["peak_pal"][0] = colorwheel(pos[0]) + states["noise_floor"] = pos[1] + states["smoothing_factor"] = pos[2] + spectrum_group = states["spectrum_group"] + column_table = states["column_table"] + moving_avg_buffer = states["moving_avg_buffer"] + smoothing_factor = states["smoothing_factor"] + height_multiplier = states["height_multiplier"] + dynamic_level = states["dynamic_level"] + noise_floor = states["noise_floor"] + num_columns = states["num_columns"] + + mic.record(rec_buf, fft_size) + samples = np.array(rec_buf) + + spectrum = spectrogram(samples)[low_bin : high_bin + 1] + spectrum = np.log(spectrum + 1e-7) + spectrum = np.maximum(spectrum - noise_floor, 0) + lower = max(np.min(spectrum), 4) + upper = min(max(np.max(spectrum), lower + 12), 20) + if upper > dynamic_level: + dynamic_level = upper * 0.7 + dynamic_level * 0.3 + else: + dynamic_level = dynamic_level * 0.5 + lower * 0.5 + states["dynamic_level"] = dynamic_level + max_height = display.height + data = (spectrum - lower) * (max_height / (dynamic_level - lower)) * height_multiplier + + for column, element in enumerate(column_table): + first_bin = element[0] + column_top = display.height + 1 + for bin_offset, weight in enumerate(element[1]): + if first_bin + bin_offset < len(data): + column_top -= data[first_bin + bin_offset] * weight + column_top = max(0, int(column_top)) + moving_avg_buffer[column] = ( + moving_avg_buffer[column] * (1 - smoothing_factor) + + column_top * smoothing_factor + ) + smoothed_top = int(moving_avg_buffer[column]) + rect = spectrum_group[column] + rect.height = display.height - smoothed_top + rect.y = smoothed_top + + if smoothed_top < element[3]: + element[3] = smoothed_top - 1 + element[4] = 0 + else: + element[3] += element[4] + element[4] += 0.2 + peak_position = max(0, int(element[3])) + peak_dot = spectrum_group[num_columns + column] + peak_dot.y = peak_position + display.refresh() +# ------ INITIALIZE CIRCLE ANIMATION ------ +def initialize_circles(): + global states + spectrum_group = displayio.Group() + display.root_group = spectrum_group + palette = displayio.Palette(1) + palette[0] = 0xFFFFFF + center_palette = displayio.Palette(1) + center_palette[0] = 0xFF0000 + center_circle = ( + vectorio.Circle(pixel_shader=center_palette, radius=5, + x=display.width // 2, y=display.height // 2) + ) + spectrum_group.append(center_circle) + num_circles = 16 + smoothing_factor = 0.5 + decay_factor = 0.2 + circles = [] + directions = [] + smoothed_radii = [5] * num_circles + + for i in range(num_circles): + radius = 5 + x_pos = randint(radius, display.width - radius) + y_pos = randint(radius, display.height - radius) + dx = randint(-2, 2) or 1 + dy = randint(-2, 2) or 1 + color_index = (255 * i) // num_circles + circle_palette = displayio.Palette(1) + circle_palette[0] = colorwheel(color_index) + circle = vectorio.Circle(pixel_shader=circle_palette, radius=radius, x=x_pos, y=y_pos) + spectrum_group.append(circle) + circles.append(circle) + directions.append([dx, dy]) + states = { + "spectrum_group": spectrum_group, + "center_circle": center_circle, + "center_radius_smoothed": 5, + "circles": circles, + "directions": directions, + "smoothed_radii": smoothed_radii, + "smoothing_factor": smoothing_factor, + "decay_factor": decay_factor, + "dynamic_level": 15, + "noise_floor": 3.1, + "max_radius": 100, + "num_circles": num_circles, + "center_palette": center_palette, + "speed": 1, + } +# ------ BOUNCING CIRCLES ANIMATION ------ +def bouncing_circles(pos, read): + global states + if read: + states["center_palette"][0] = colorwheel(pos[0]) + states["noise_floor"] = pos[1] + states["smoothing_factor"] = pos[2] + states["decay_factor"] = pos[2] - 0.3 + mic.record(rec_buf, fft_size) + samples = np.array(rec_buf) + spectrum = spectrogram(samples)[low_bin : high_bin + 1] + spectrum = np.log(spectrum + 1e-7) + spectrum = np.maximum(spectrum - states["noise_floor"], 0) + lower = max(np.min(spectrum), 4) + upper = min(max(np.max(spectrum), lower + 12), 20) + if upper > states["dynamic_level"]: + states["dynamic_level"] = upper * 0.7 + states["dynamic_level"] * 0.3 + else: + states["dynamic_level"] = states["dynamic_level"] * 0.5 + lower * 0.5 + overall_amplitude = np.sum(spectrum) + max_center_radius = 50 + target_center_radius = ( + int((overall_amplitude / (states["dynamic_level"] * states["num_circles"])) * max_center_radius) + ) + if target_center_radius < states["center_radius_smoothed"]: + states["center_radius_smoothed"] = ( + states["center_radius_smoothed"] * (1 - states["decay_factor"]) + + target_center_radius * states["decay_factor"] + ) + else: + states["center_radius_smoothed"] = ( + states["center_radius_smoothed"] * (1 - states["smoothing_factor"]) + + target_center_radius * states["smoothing_factor"] + ) + states["center_circle"].radius = int(states["center_radius_smoothed"]) + data = (spectrum - lower) * (states["max_radius"] / (states["dynamic_level"] - lower)) + for i, circle in enumerate(states["circles"]): + target_radius = max(2, int(data[i])) + if target_radius < states["smoothed_radii"][i]: + states["smoothed_radii"][i] = ( + states["smoothed_radii"][i] * (1 - states["decay_factor"]) + + target_radius * states["decay_factor"] + ) + else: + states["smoothed_radii"][i] = ( + states["smoothed_radii"][i] * (1 - states["smoothing_factor"]) + + target_radius * states["smoothing_factor"] + ) + circle.radius = int(states["smoothed_radii"][i]) + dx, dy = states["directions"][i] + circle.x += dx + circle.y += dy + if circle.x - circle.radius <= 0 or circle.x + circle.radius >= display.width: + states["directions"][i][0] *= -1 # Reverse x direction + if circle.y - circle.radius <= 0 or circle.y + circle.radius >= display.height: + states["directions"][i][1] *= -1 # Reverse y direction + display.refresh() +# ------ PARTY PARROT INIT ------ +def initialize_party(): + global states + spectrum_group = displayio.Group() + display.root_group = spectrum_group + bitmap, palette = adafruit_imageload.load( + "/partyParrotsBig.bmp", + bitmap=displayio.Bitmap, + palette=displayio.Palette + ) + parrot_grid = displayio.TileGrid( + bitmap, + pixel_shader=palette, + tile_height=128, + tile_width=132, + x=(display.width - 128) // 2, + y=0 + ) + spectrum_group.append(parrot_grid) + line_group = displayio.Group() + spectrum_group.append(line_group) + pal_bg = displayio.Palette(1) + pal_bg[0] = 0x0000FF + palette_white = displayio.Palette(1) + palette_white[0] = 0xFFFFFF + pal = displayio.Palette(1) + pal[0] = 0xFF00FF + left_circle = vectorio.Circle( + pixel_shader=pal, radius=5, x=5, y=5 + ) + right_circle = vectorio.Circle( + pixel_shader=pal, radius=5, x=display.width - 5, y=5 + ) + spectrum_group.append(left_circle) + spectrum_group.append(right_circle) + ground = vectorio.Rectangle( + pixel_shader=pal_bg, + width=display.width, + height=display.height - 128, + x=0, + y=128 + ) + line_group.append(ground) + horizon_line = vectorio.Rectangle( + pixel_shader=palette_white, + width=display.width, + height=1, + x=0, + y=128 + ) + line_group.append(horizon_line) + slanted_lines_coords = [ + (0, 136, 34, 128), + (0, 188, 76, 128), + (34, 240, 113, 128), + (117, 240, 148, 128), + (198, 240, 182, 128), + (294, 240, 216, 128), + (320, 176, 255, 128), + (320, 133, 297, 128) + ] + for coords in slanted_lines_coords: + line = Line(coords[0], coords[1], coords[2], coords[3], 0xFFFFFF) + line_group.append(line) + horizontal_lines = [] + for _ in range(5): + line_rect = vectorio.Rectangle( + pixel_shader=palette_white, + width=display.width, + height=2, + x=0, + y=0 + ) + line_group.append(line_rect) + horizontal_lines.append(line_rect) + states = { + "pal": pal, + "pal_bg": pal_bg, + "pal_line": palette_white, + "spectrum_group": spectrum_group, + "parrot_grid": parrot_grid, + "line_group": line_group, + "horizontal_lines": horizontal_lines, + "frame_index": 0, + "low_band_threshold": 3.4, + "mid_band_threshold": 3.4, + "smoothing_factor": 0.5, + "last_i": 146, + "dynamic_level": 15, + "decay_factor": 2, + "max_center_radius": 10, + "center_radius_smoothed": 2, + "left_circle": left_circle, + "right_circle": right_circle, + "clock_clock": ticks_ms(), + "clock_time": int(0.01 * 1000), + "i": 152 + } +# ------ PARTY PARROT ANIMATION ------ +def party_parrot(pos, read): + global states + if read: + states["pal"][0] = colorwheel(pos[0]) + states["max_center_radius"] = pos[1] + states["low_band_threshold"] = pos[2] + states["mid_band_threshold"] = pos[2] + left_circle = states["left_circle"] + right_circle = states["right_circle"] + parrot_grid = states["parrot_grid"] + horizontal_lines = states["horizontal_lines"] + frame_index = states["frame_index"] + last_i = states["last_i"] + center_radius_smoothed = states["center_radius_smoothed"] + dynamic_level = states["dynamic_level"] + low_band_threshold = states["low_band_threshold"] + mid_band_threshold = states["mid_band_threshold"] + smoothing_factor = states["smoothing_factor"] + decay_factor = states["decay_factor"] + clock_clock = states["clock_clock"] + palette_blue = states["pal_bg"] + palette_white = states["pal_line"] + i = states["i"] + if i > 128: + last_i = i + i -= 1 + else: + i = 152 + mic.record(rec_buf, fft_size) + samples = np.array(rec_buf) + spectrum = spectrogram(samples) + spectrum = np.log(spectrum + 1e-7) + spectrum = np.maximum(spectrum - 3.1, 0) + low_band_avg = np.mean(spectrum[low_band[0]:low_band[1] + 1]) + mid_band_avg = np.mean(spectrum[mid_band[0]:mid_band[1] + 1]) + overall_amplitude = np.sum(spectrum) + target_center_radius = ( + int((overall_amplitude / (dynamic_level * 16)) * states["max_center_radius"]) + ) + if target_center_radius < center_radius_smoothed: + center_radius_smoothed = ( + center_radius_smoothed * (1 - decay_factor) + target_center_radius * decay_factor + ) + else: + center_radius_smoothed = ( + center_radius_smoothed * (1 - smoothing_factor) + target_center_radius * smoothing_factor + ) + left_circle.radius = int(center_radius_smoothed) + right_circle.radius = int(center_radius_smoothed) + if low_band_avg >= low_band_threshold * 1.1 or mid_band_avg >= mid_band_threshold * 1.1: + frame_index = (frame_index + 1) % 10 + parrot_grid[0] = frame_index + if ticks_diff(ticks_ms(), clock_clock) >= states["clock_time"]: + for idx, offset in enumerate([0, 25, 50, 75, 100]): + horizontal_lines[idx].y = last_i + offset + horizontal_lines[idx].pixel_shader = palette_blue + for idx, offset in enumerate([0, 25, 50, 75, 100]): + horizontal_lines[idx].y = i + offset + horizontal_lines[idx].pixel_shader = palette_white + clock_clock = ticks_add(clock_clock, states["clock_time"]) + display.refresh() + states["frame_index"] = frame_index + states["last_i"] = last_i + states["i"] = i + states["center_radius_smoothed"] = center_radius_smoothed +# ------ THE LOOP ------ +while True: + # read encoder - if value != then change mode + position = -encoder.position + if position != last_position: + if position > last_position: + mode = (mode + 1) % 3 + else: + mode = (mode - 1) % 3 + new_mode = True + last_position = position + # encode button - switch between reading potentiometer + # to control animations or using default values + if not button.value and not button_held: + button_held = True + read_pots = not read_pots + print("Button pressed") + if button.value and button_held: + button_held = False + print("Button released") + # if a new mode is selected, run init function + if new_mode: + new_mode = False + print(f"switching modes! {mode}") + del states + gc.collect() + display.refresh() + if mode == 0: + initialize_bars() + if mode == 1: + initialize_circles() + if mode == 2: + initialize_party() + # mode 0 - bar graph visualizer + if mode == 0: + bars(mode0_values, read_pots) + # pot 1 - control color of bouncing dot + color = simpleio.map_range(val(pot1), 0, 65535, 0, 255) + mode_vals[0][0] = color + # pot 2 - raise/lower noise floor + noise = simpleio.map_range(val(pot2), 0, 65535, 2.5, 4.5) + mode_vals[0][1] = noise + # pot 3 - smooth bar animation + smooth = simpleio.map_range(val(pot3), 0, 65535, 0.5, 0.05) + mode_vals[0][2] = smooth + # mode 1 - bouncing circles visualizer + if mode == 1: + bouncing_circles(mode1_values, read_pots) + # pot 1 - control color of center circle + color = simpleio.map_range(val(pot1), 0, 65535, 0, 255) + mode_vals[1][0] = color + # pot 2 - raise/lower noise floor + noise = simpleio.map_range(val(pot2), 0, 65535, 2.5, 4.5) + mode_vals[1][1] = noise + # pot 3 - smooth circle size change + smooth = simpleio.map_range(val(pot3), 0, 65535, 0.8, 0.4) + mode_vals[1][2] = smooth + # mode 2 - party parrot synth wave + if mode == 2: + party_parrot(mode2_values, read_pots) + # pot 1 - control color of side circles + color = simpleio.map_range(val(pot1), 0, 65535, 0, 255) + mode_vals[2][0] = color + # pot 2 - mid & low end noise floor aka parrot sensitivity + dynamic = simpleio.map_range(val(pot2), 0, 65535, 3.0, 6.0) + mode_vals[2][1] = dynamic + # pot 3 - size of side circles + rad = simpleio.map_range(val(pot3), 0, 65535, 2, 12) + mode_vals[2][2] = rad diff --git a/RP2350_HSTX_Video_Synth/partyParrotsBig.bmp b/RP2350_HSTX_Video_Synth/partyParrotsBig.bmp new file mode 100644 index 000000000..89244c332 Binary files /dev/null and b/RP2350_HSTX_Video_Synth/partyParrotsBig.bmp differ diff --git a/RS-232_Pal_Demos/Arduino_RS-232_Pal/.uno.test.only b/RS-232_Pal_Demos/Arduino_RS-232_Pal/.uno.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/RS-232_Pal_Demos/Arduino_RS-232_Pal/Arduino_RS-232_Pal.ino b/RS-232_Pal_Demos/Arduino_RS-232_Pal/Arduino_RS-232_Pal.ino new file mode 100644 index 000000000..d65dd108d --- /dev/null +++ b/RS-232_Pal_Demos/Arduino_RS-232_Pal/Arduino_RS-232_Pal.ino @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +// update this for your RS-232 device baud rate +#define baud 38400 +// define RX and TX pins for the software serial port +#define RS232_RX_PIN 2 +#define RS232_TX_PIN 3 + +SoftwareSerial rs232Serial(RS232_RX_PIN, RS232_TX_PIN); + +void setup() { + Serial.begin(115200); + while ( !Serial ) delay(10); + + rs232Serial.begin(baud); + + Serial.println("Enter commands to send to the RS-232 device."); + Serial.println(); +} + +void loop() { + + if (Serial.available() > 0) { + String userInput = Serial.readStringUntil('\n'); + userInput.trim(); // remove any trailing newlines or spaces + if (userInput.length() > 0) { + // send the command with a telnet newline (CR + LF) + rs232Serial.print(userInput + "\r\n"); + Serial.print("Sent: "); + Serial.println(userInput); + } + } + + // check for incoming data from RS-232 device + while (rs232Serial.available() > 0) { + char response = rs232Serial.read(); + // print the incoming data + Serial.print(response); + } + + delay(50); +} diff --git a/RS-232_Pal_Demos/CircuitPython/code.py b/RS-232_Pal_Demos/CircuitPython/code.py new file mode 100644 index 000000000..a5e6fa332 --- /dev/null +++ b/RS-232_Pal_Demos/CircuitPython/code.py @@ -0,0 +1,42 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# SPDX-License-Identifier: MIT + +import time +import board + +# baud rate for your device +baud = 38400 +# Initialize UART for the CH9328 +# check for Raspberry Pi +# pylint: disable=simplifiable-condition +if "CE0" and "CE1" in dir(board): + import serial + + uart = serial.Serial("/dev/ttyS0", baudrate=baud, timeout=3000) +# otherwise use busio +else: + import busio + + uart = busio.UART(board.TX, board.RX, baudrate=baud) + +print("Enter commands to send to the RS-232 device. Press Ctrl+C to exit.") +while True: + user_input = input("Please enter your command: ").strip() + if user_input: + # send the command with a telnet newline (CR + LF) + uart.write((user_input + "\r\n").encode('ascii')) + + # empty buffer to collect the incoming data + response_buffer = bytearray() + + # check for data + time.sleep(1) + while uart.in_waiting: + data = uart.read(uart.in_waiting) + if data: + response_buffer.extend(data) + + # decode and print + if response_buffer: + print(response_buffer.decode('ascii'), end='') + print() diff --git a/Raspberry_Pi_NFC_Movie_Player/add_movie.py b/Raspberry_Pi_NFC_Movie_Player/add_movie.py new file mode 100644 index 000000000..ea643c6a2 --- /dev/null +++ b/Raspberry_Pi_NFC_Movie_Player/add_movie.py @@ -0,0 +1,52 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import csv +import os +import sys +import board +import busio +from digitalio import DigitalInOut +from adafruit_pn532.spi import PN532_SPI + +spi = busio.SPI(board.SCK, board.MOSI, board.MISO) +cs_pin = DigitalInOut(board.D24) +pn532 = PN532_SPI(spi, cs_pin, debug=False) + +csv_file = "movies.csv" +if not os.path.isfile(csv_file): + with open(csv_file, mode='w', newline='') as file: + writer = csv.writer(file) + writer.writerow(['uid', 'movie']) + +def is_duplicate(uid, mov): + with open(csv_file, mode='r') as f: + reader = csv.DictReader(f) + for row in reader: + if row['uid'] == uid or row['movie'] == mov: + return True + return False + +ic, ver, rev, support = pn532.firmware_version +print("Found PN532 with firmware version: {0}.{1}".format(ver, rev)) + +# Configure PN532 to communicate with MiFare cards +pn532.SAM_configuration() + +print("Waiting for new RFID/NFC card...") + +while True: + the_uid = pn532.read_passive_target(timeout=0.05) + if the_uid is not None: + uid_str = f"{[hex(i) for i in the_uid]}" + movie = input("Enter the name of the new movie: ") + movie = f"{movie}" + if is_duplicate(uid_str, movie): + print("UID {uid_str} or movie {movie} already exists, skipping.") + else: + with open(csv_file, mode='a', newline='') as file: + writer = csv.writer(file) + writer.writerow([uid_str, movie]) + print(f"Added UID {uid_str} with movie title {movie} to movies.csv") + sys.exit() diff --git a/Raspberry_Pi_NFC_Movie_Player/blinka.png b/Raspberry_Pi_NFC_Movie_Player/blinka.png new file mode 100644 index 000000000..d81c76145 Binary files /dev/null and b/Raspberry_Pi_NFC_Movie_Player/blinka.png differ diff --git a/Raspberry_Pi_NFC_Movie_Player/movies.csv b/Raspberry_Pi_NFC_Movie_Player/movies.csv new file mode 100644 index 000000000..5a1bcbe00 --- /dev/null +++ b/Raspberry_Pi_NFC_Movie_Player/movies.csv @@ -0,0 +1 @@ +uid,movie diff --git a/Raspberry_Pi_NFC_Movie_Player/nfc_movie_player.py b/Raspberry_Pi_NFC_Movie_Player/nfc_movie_player.py new file mode 100644 index 000000000..b1c96b9b9 --- /dev/null +++ b/Raspberry_Pi_NFC_Movie_Player/nfc_movie_player.py @@ -0,0 +1,125 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import subprocess +import csv +from datetime import datetime +import os +import tkinter as tk +from PIL import Image, ImageTk +import board +import busio +from digitalio import DigitalInOut +from adafruit_pn532.spi import PN532_SPI + +# ---- Update these file paths for your raspberry pi! ---- +username = "YOUR-USERNAME" +image_path = f"/home/{username}/Pictures/blinka.png" +movie_path = "/mnt/movie_disk" +csv_file = "movies.csv" +# ---- + +if not os.path.isfile(csv_file): + with open(csv_file, mode='w', newline='') as f: + writer = csv.writer(f) + writer.writerow(['uid', 'movie']) + +root = tk.Tk() +root.attributes("-fullscreen", True) +root.configure(background="black") +screen_width = root.winfo_screenwidth() +screen_height = root.winfo_screenheight() +root.geometry(f"{screen_width}x{screen_height}+0+0") + +def toggle_fullscreen(): + root.attributes("-fullscreen", not root.attributes("-fullscreen")) + +def exit_fullscreen(): + root.destroy() + +root.bind("", toggle_fullscreen) +root.bind("", exit_fullscreen) + +image = Image.open(image_path) +photo = ImageTk.PhotoImage(image) + +image_label = tk.Label(root, image=photo, bg="black") +image_label.place(x=0, y=0) + +info_label = tk.Label(root, text = "00:00: AM", font=("Helvetica", 68), fg="white", bg="black") +info_label.place(x=1870, y = 1030, anchor="se") + +x_pos, y_pos = 100, 100 +x_speed, y_speed = 1, 1 + +spi = busio.SPI(board.SCK, board.MOSI, board.MISO) +cs_pin = DigitalInOut(board.D24) +pn532 = PN532_SPI(spi, cs_pin, debug=False) + +ic, ver, rev, support = pn532.firmware_version +print("Found PN532 with firmware version: {0}.{1}".format(ver, rev)) + +# Configure PN532 to communicate with MiFare cards +pn532.SAM_configuration() + +print("Waiting for RFID/NFC card...") + +now_playing = False +# pylint: disable=global-statement +def move(): + global x_pos, y_pos, x_speed, y_speed + x_pos += x_speed + y_pos += y_speed + if x_pos + photo.width() >= root.winfo_screenwidth() or x_pos <= 0: + x_speed = -x_speed + if y_pos + photo.height() >= root.winfo_screenheight() or y_pos <= 0: + y_speed = -y_speed + image_label.place(x=x_pos, y=y_pos) + root.after(30, move) + +def get_movie(uid): + with open(f"/home/{username}/{csv_file}", "r") as file: + reader = csv.DictReader(file) + for row in reader: + if row["uid"] == uid: + return row["movie"] + return None + +def read_card(): + global now_playing + uid = pn532.read_passive_target(timeout=0.05) + # Try again if no card is available. + if uid is not None: + print("Found card with UID:", [hex(i) for i in uid]) + title = str([hex(i) for i in uid]) + movie_name = get_movie(title) + if movie_path: + video = f"{movie_path}/{movie_name}.mp4" + subprocess.run(["sudo", "-u", username, "vlc", "--fullscreen", video], check=False) + now_playing = True + else: + current_time = datetime.now().strftime("%I:%M %p") + info_label.config(text=f"{current_time}") + root.after(2000, read_card) + +def vlc_check(): + global now_playing + try: + result = subprocess.check_output(["pgrep", "-x", "vlc"]) + if result: + return True + else: + return False + except subprocess.CalledProcessError: + now_playing = False + return False + root.after(5000, vlc_check) + +if not now_playing: + move() + read_card() +if now_playing: + vlc_check() + +root.mainloop() diff --git a/Raspberry_Pi_NFC_Movie_Player/nfcmedia_systemd.txt b/Raspberry_Pi_NFC_Movie_Player/nfcmedia_systemd.txt new file mode 100644 index 000000000..c1cdbfa98 --- /dev/null +++ b/Raspberry_Pi_NFC_Movie_Player/nfcmedia_systemd.txt @@ -0,0 +1,13 @@ +[Unit] +Description=NFC Media Player +After=x-session-manager.service + +[Service] +User=USERNAME +Environment=DISPLAY=:0 +Environment=XAUTHORITY=/home/USERNAME/.Xauthority +ExecStartPre=/bin/sleep 10 +ExecStart=sudo /home/USERNAME/blinka/bin/python /home/USERNAME/nfc_movie_player.py + +[Install] +WantedBy=default.target diff --git a/SEN5x_Adapter_Demos/Python/code.py b/SEN5x_Adapter_Demos/Python/code.py new file mode 100644 index 000000000..e7841a5ac --- /dev/null +++ b/SEN5x_Adapter_Demos/Python/code.py @@ -0,0 +1,43 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +from sensirion_i2c_driver import I2cConnection, LinuxI2cTransceiver +from sensirion_i2c_sen5x import Sen5xI2cDevice + +i2c = LinuxI2cTransceiver('/dev/i2c-1') +device = Sen5xI2cDevice(I2cConnection(i2c)) + +# Print some device information +print(f"Version: {device.get_version()}") +print(f"Product Name: {device.get_product_name()}") +print(f"Serial Number: {device.get_serial_number()}") + +# Perform a device reset (reboot firmware) +device.device_reset() +# Start measurement +device.start_measurement() +time.sleep(1) + +def read_data(): + try: + # Wait until next result is available + print("Waiting for new data...") + while device.read_data_ready() is False: + time.sleep(0.1) + # Read measured values -> clears the "data ready" flag + values = device.read_measured_values() + print(values) + # Access a specific value separately (see Sen5xMeasuredValues) + # mass_concentration = values.mass_concentration_2p5.physical + # ambient_temperature = values.ambient_temperature.degrees_celsius + # Read device status + status = device.read_device_status() + print("Device Status: {}\n".format(status)) + except Exception as e: # pylint: disable = broad-except + print(f"Error: {e}") + +while True: + read_data() + time.sleep(5) diff --git a/SHT4x_Trinkey_Demos/Arduino/sht4x_temp_humidity/.sht4xtrinkey_m0.test.only b/SHT4x_Trinkey_Demos/Arduino/sht4x_temp_humidity/.sht4xtrinkey_m0.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/SHT4x_Trinkey_Demos/Arduino/sht4x_temp_humidity/sht4x_temp_humidity.ino b/SHT4x_Trinkey_Demos/Arduino/sht4x_temp_humidity/sht4x_temp_humidity.ino new file mode 100644 index 000000000..8be28a05c --- /dev/null +++ b/SHT4x_Trinkey_Demos/Arduino/sht4x_temp_humidity/sht4x_temp_humidity.ino @@ -0,0 +1,38 @@ +// SPDX-FileCopyrightText: 2024 Limor Fried for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +Adafruit_SHT4x sht4 = Adafruit_SHT4x(); + +void setup() { + Serial.begin(115200); + + while (!Serial) { + delay(10); // will pause until serial console opens + } + + Serial.println("# Adafruit SHT4x Trinkey Temperature and Humidity Demo"); + if (! sht4.begin()) { + Serial.println("# Couldn't find SHT4x"); + while (1) delay(1); + } + Serial.println("# Found SHT4x sensor."); + + sht4.setPrecision(SHT4X_HIGH_PRECISION); + sht4.setHeater(SHT4X_NO_HEATER); + Serial.println("Temperature in *C, Relative Humidity %"); +} + +void loop() { + sensors_event_t humidity, temp; + + sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data + Serial.print(temp.temperature); + Serial.print(", "); + Serial.println(humidity.relative_humidity); + + // 1 second between readings + delay(1000); +} diff --git a/SHT4x_Trinkey_Demos/Arduino/sht4x_vapor-pressure_deficit/.sht4xtrinkey_m0.test.only b/SHT4x_Trinkey_Demos/Arduino/sht4x_vapor-pressure_deficit/.sht4xtrinkey_m0.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/SHT4x_Trinkey_Demos/Arduino/sht4x_vapor-pressure_deficit/sht4x_vapor-pressure_deficit.ino b/SHT4x_Trinkey_Demos/Arduino/sht4x_vapor-pressure_deficit/sht4x_vapor-pressure_deficit.ino new file mode 100644 index 000000000..60b0e949e --- /dev/null +++ b/SHT4x_Trinkey_Demos/Arduino/sht4x_vapor-pressure_deficit/sht4x_vapor-pressure_deficit.ino @@ -0,0 +1,42 @@ +// SPDX-FileCopyrightText: 2024 Limor Fried for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +Adafruit_SHT4x sht4 = Adafruit_SHT4x(); + +void setup() { + Serial.begin(115200); + + while (!Serial) { + delay(10); // will pause until serial console opens + } + + Serial.println("# Adafruit SHT4x Trinkey Vapor-Pressure Deficit Demo"); + if (! sht4.begin()) { + Serial.println("# Couldn't find SHT4x"); + while (1) delay(1); + } + Serial.println("# Found SHT4x sensor."); + + sht4.setPrecision(SHT4X_HIGH_PRECISION); + sht4.setHeater(SHT4X_NO_HEATER); + Serial.println("Vapor-Pressure Deficit (kPa)"); +} + +void loop() { + sensors_event_t humidity, temp; + + sht4.getEvent(&humidity, &temp);// populate temp and humidity objects with fresh data + // saturation vapor pressure is calculated + float svp = 0.6108 * exp(17.27 * temp.temperature / (temp.temperature + 237.3)); + // actual vapor pressure + float avp = humidity.relative_humidity / 100 * svp; + // VPD = saturation vapor pressure - actual vapor pressure + float vpd = svp - avp; + Serial.println(vpd); + + // 1 second between readings + delay(1000); +} diff --git a/SHT4x_Trinkey_Demos/Arduino/trinkey_cap_touch/.sht4xtrinkey_m0.test.only b/SHT4x_Trinkey_Demos/Arduino/trinkey_cap_touch/.sht4xtrinkey_m0.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/SHT4x_Trinkey_Demos/Arduino/trinkey_cap_touch/trinkey_cap_touch.ino b/SHT4x_Trinkey_Demos/Arduino/trinkey_cap_touch/trinkey_cap_touch.ino new file mode 100644 index 000000000..bb3168c6a --- /dev/null +++ b/SHT4x_Trinkey_Demos/Arduino/trinkey_cap_touch/trinkey_cap_touch.ino @@ -0,0 +1,26 @@ +// SPDX-FileCopyrightText: 2024 Limor Fried for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +Adafruit_FreeTouch touch = Adafruit_FreeTouch(1, OVERSAMPLE_4, RESISTOR_50K, FREQ_MODE_NONE); + +void setup() { + Serial.begin(115200); + + while (!Serial) { + delay(10); // will pause until serial console opens + } + + if (! touch.begin()) { + Serial.println("Failed to begin QTouch on pin 1"); + } +} + + +void loop() { + + Serial.println(touch.measure()); + delay(1000); +} diff --git a/SHT4x_Trinkey_Demos/Arduino/trinkey_neopixel_blink/.sht4xtrinkey_m0.test.only b/SHT4x_Trinkey_Demos/Arduino/trinkey_neopixel_blink/.sht4xtrinkey_m0.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/SHT4x_Trinkey_Demos/Arduino/trinkey_neopixel_blink/trinkey_neopixel_blink.ino b/SHT4x_Trinkey_Demos/Arduino/trinkey_neopixel_blink/trinkey_neopixel_blink.ino new file mode 100644 index 000000000..bad5e2428 --- /dev/null +++ b/SHT4x_Trinkey_Demos/Arduino/trinkey_neopixel_blink/trinkey_neopixel_blink.ino @@ -0,0 +1,24 @@ +// SPDX-FileCopyrightText: 2024 Limor Fried for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +Adafruit_NeoPixel pixel(1, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800); + +void setup() { + pixel.begin(); + pixel.setBrightness(10); + pixel.show(); +} + +void loop() { + pixel.setPixelColor(0, 0xFF0000); + pixel.show(); + Serial.println("on!"); + delay(1000); + pixel.setPixelColor(0, 0x0); + pixel.show(); + Serial.println("off!"); + delay(1000); +} diff --git a/SHT4x_Trinkey_Demos/CPython/CPython_SHT4x_Trinkey_AdafruitIO/sht4x_trinkey_io.py b/SHT4x_Trinkey_Demos/CPython/CPython_SHT4x_Trinkey_AdafruitIO/sht4x_trinkey_io.py new file mode 100644 index 000000000..1b7929eb0 --- /dev/null +++ b/SHT4x_Trinkey_Demos/CPython/CPython_SHT4x_Trinkey_AdafruitIO/sht4x_trinkey_io.py @@ -0,0 +1,92 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +# Written by Liz Clark (Adafruit Industries) with OpenAI ChatGPT v4 Feb 13, 2024 build +# https://help.openai.com/en/articles/6825453-chatgpt-release-notes + +# https://chat.openai.com/share/79f4ba33-c045-4fbb-b468-3625f5622b8b + +import time +from threading import Thread, Lock +import serial +from Adafruit_IO import Client, Feed + +# Configuration +com_port = 'COM123' # Adjust this to your COM port +baud_rate = 115200 +io_delay = 5 + +# Set to your Adafruit IO key. +# Remember, your key is a secret, +# so make sure not to publish it when you publish this code! +ADAFRUIT_IO_KEY = 'your-io-key-here' + +# Set to your Adafruit IO username. +# (go to https://accounts.adafruit.com to find your username) +ADAFRUIT_IO_USERNAME = 'your-io-username-here' + +# Shared buffer for sensor data +sensor_data = {'temperature': 0, 'humidity': 0} +data_lock = Lock() +stop_signal = False # Shared stop signal + +print("Connecting to Adafruit IO...") +# Create an instance of the REST client. +aio = Client(ADAFRUIT_IO_USERNAME, ADAFRUIT_IO_KEY) +print("Connected!") + +try: + sht4x_temp = aio.feeds('temp-feed') +except: # pylint: disable = bare-except + feed = Feed(name='temp-feed') + sht4x_temp = aio.create_feed(feed) + +try: + sht4x_humid = aio.feeds('humid-feed') +except: # pylint: disable = bare-except + feed = Feed(name='humid_feed') + sht4x_humid = aio.create_feed(feed) + +def read_sensor_data(ser): + while not stop_signal: + line = ser.readline().decode('utf-8').strip() + temperature, humidity = line.split(',') + with data_lock: + sensor_data['temperature'] = temperature + sensor_data['humidity'] = humidity + time.sleep(1) + +def send_data_to_io(): + while not stop_signal: + time.sleep(io_delay) # Adjust timing as needed + with data_lock: + temperature = sensor_data['temperature'] + humidity = sensor_data['humidity'] + aio.send_data(sht4x_temp.key, temperature) + aio.send_data(sht4x_humid.key, humidity) + print(f"Logged: Temperature={temperature}°C, Humidity={humidity}%") + +def main(): + global stop_signal # pylint: disable = global-statement + try: + with serial.Serial(com_port, baud_rate, timeout=1) as ser: + print("Starting data logging to Adafruit IO... Press Ctrl+C to stop.") + sensor_thread = Thread(target=read_sensor_data, args=(ser,)) + io_thread = Thread(target=send_data_to_io) + + sensor_thread.start() + io_thread.start() + + while True: + time.sleep(0.1) + except KeyboardInterrupt: + print("\nShutting down...") + stop_signal = True + finally: + sensor_thread.join() + io_thread.join() + print("Data logging stopped.") + +if __name__ == '__main__': + main() diff --git a/SHT4x_Trinkey_Demos/CPython/CPython_SHT4x_Trinkey_AdafruitIO/sht4x_trinkey_logger.uf2 b/SHT4x_Trinkey_Demos/CPython/CPython_SHT4x_Trinkey_AdafruitIO/sht4x_trinkey_logger.uf2 new file mode 100644 index 000000000..634735422 Binary files /dev/null and b/SHT4x_Trinkey_Demos/CPython/CPython_SHT4x_Trinkey_AdafruitIO/sht4x_trinkey_logger.uf2 differ diff --git a/SHT4x_Trinkey_Demos/CPython/CPython_SHT4x_Trinkey_Logger/sht4x_trinkey_logger.py b/SHT4x_Trinkey_Demos/CPython/CPython_SHT4x_Trinkey_Logger/sht4x_trinkey_logger.py new file mode 100644 index 000000000..3151f58e0 --- /dev/null +++ b/SHT4x_Trinkey_Demos/CPython/CPython_SHT4x_Trinkey_Logger/sht4x_trinkey_logger.py @@ -0,0 +1,60 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +# Written by Liz Clark (Adafruit Industries) with OpenAI ChatGPT v4 Feb 13, 2024 build +# https://help.openai.com/en/articles/6825453-chatgpt-release-notes + +# https://chat.openai.com/share/430869c1-e28f-4203-9750-c6bbabe18be6 + +import os +import time +import csv +import serial + +# Configuration +com_port = 'COM121' # Adjust this to your COM port +baud_rate = 115200 # Adjust this to the baud rate of your sensor +base_csv_file_path = 'sensor_readings' + +def find_next_file_name(base_path): + """Finds the next available file name with an incremented suffix.""" + counter = 0 + while True: + new_path = f"{base_path}_{counter}.csv" if counter else f"{base_path}.csv" + if not os.path.isfile(new_path): + return new_path + counter += 1 + +def read_sensor_data(ser): + line = ser.readline().decode('utf-8').strip() + temperature, humidity = line.split(',') + return float(temperature), float(humidity) + +def save_to_csv(file_path, temperature, humidity): + with open(file_path, mode='a', newline='') as file: + writer = csv.writer(file) + # Convert struct_time to a string for the CSV + timestamp = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + writer.writerow([timestamp, temperature, humidity]) + +def main(): + csv_file_path = find_next_file_name(base_csv_file_path) + # Write headers to the new file + with open(csv_file_path, mode='w', newline='') as file: + writer = csv.writer(file) + writer.writerow(["Timestamp", "Temperature", "Humidity"]) + + with serial.Serial(com_port, baud_rate, timeout=1) as ser: + print(f"Starting data logging to {csv_file_path}... Press Ctrl+C to stop.") + try: + while True: + temperature, humidity = read_sensor_data(ser) + save_to_csv(csv_file_path, temperature, humidity) + print(f"Logged: Temperature={temperature}°C, Humidity={humidity}%") + time.sleep(1) + except KeyboardInterrupt: + print("Data logging stopped.") + +if __name__ == '__main__': + main() diff --git a/SHT4x_Trinkey_Demos/CPython/CPython_SHT4x_Trinkey_Logger/sht4x_trinkey_logger.uf2 b/SHT4x_Trinkey_Demos/CPython/CPython_SHT4x_Trinkey_Logger/sht4x_trinkey_logger.uf2 new file mode 100644 index 000000000..634735422 Binary files /dev/null and b/SHT4x_Trinkey_Demos/CPython/CPython_SHT4x_Trinkey_Logger/sht4x_trinkey_logger.uf2 differ diff --git a/SHT4x_Trinkey_Demos/CircuitPython/sht4x_temp_humidity/code.py b/SHT4x_Trinkey_Demos/CircuitPython/sht4x_temp_humidity/code.py new file mode 100644 index 000000000..653c2e24c --- /dev/null +++ b/SHT4x_Trinkey_Demos/CircuitPython/sht4x_temp_humidity/code.py @@ -0,0 +1,23 @@ +# SPDX-FileCopyrightText: Copyright (c) 2020 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +import adafruit_sht4x + +i2c = board.I2C() # uses board.SCL and board.SDA +sht = adafruit_sht4x.SHT4x(i2c) +# overflow issue with sht41, not present with sht45 +# print("Found SHT4x with serial number", hex(sht.serial_number)) + +sht.mode = adafruit_sht4x.Mode.NOHEAT_HIGHPRECISION +print("Current mode is: ", adafruit_sht4x.Mode.string[sht.mode]) +print() + +while True: + temperature, relative_humidity = sht.measurements + print(f"Temperature: {temperature:0.1f} C") + print(f"Humidity: {relative_humidity:0.1f} %") + print("") + time.sleep(1) diff --git a/SHT4x_Trinkey_Demos/CircuitPython/sht4x_vapor-pressure_deficit/code.py b/SHT4x_Trinkey_Demos/CircuitPython/sht4x_vapor-pressure_deficit/code.py new file mode 100644 index 000000000..795f786d4 --- /dev/null +++ b/SHT4x_Trinkey_Demos/CircuitPython/sht4x_vapor-pressure_deficit/code.py @@ -0,0 +1,23 @@ +# SPDX-FileCopyrightText: Copyright (c) 2020 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import math +import board +import adafruit_sht4x + +i2c = board.I2C() # uses board.SCL and board.SDA +sht = adafruit_sht4x.SHT4x(i2c) +sht.mode = adafruit_sht4x.Mode.NOHEAT_HIGHPRECISION + +while True: + temperature, relative_humidity = sht.measurements + # saturation vapor pressure is calculated + svp = 0.6108 * math.exp(17.27 * temperature / (temperature + 237.3)) + # actual vapor pressure + avp = relative_humidity / 100 * svp + # VPD = saturation vapor pressure - actual vapor pressure + vpd = svp - avp + print(f"Vapor-Pressure Deficit: {vpd:0.1f} kPa") + time.sleep(1) diff --git a/STEMMA_IR_Demodulator_Examples/Arduino_STEMMA_IR_Demodulator_Example/.uno.test.only b/STEMMA_IR_Demodulator_Examples/Arduino_STEMMA_IR_Demodulator_Example/.uno.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/STEMMA_IR_Demodulator_Examples/Arduino_STEMMA_IR_Demodulator_Example/Arduino_STEMMA_IR_Demodulator_Example.ino b/STEMMA_IR_Demodulator_Examples/Arduino_STEMMA_IR_Demodulator_Example/Arduino_STEMMA_IR_Demodulator_Example.ino new file mode 100644 index 000000000..1df56d1d9 --- /dev/null +++ b/STEMMA_IR_Demodulator_Examples/Arduino_STEMMA_IR_Demodulator_Example/Arduino_STEMMA_IR_Demodulator_Example.ino @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/* + * Based on the ReceiverDump.cpp from the + * Arduino-IRremote https://github.com/Arduino-IRremote/Arduino-IRremote. + * by Armin Joachimsmeyer + ************************************************************************************ + * MIT License + * + * Copyright (c) 2020-2023 Armin Joachimsmeyer + * + */ + +#include +#include + +#define IR_RECEIVE_PIN 5 +#define MARK_EXCESS_MICROS 20 // Adapt it to your IR receiver module. 20 is recommended for the cheap VS1838 modules. + +int ir_count = 0; +bool ir_state = false; + +void setup() { + pinMode(LED_BUILTIN, OUTPUT); + + Serial.begin(115200); + // Start the receiver and if not 3. parameter specified, take LED_BUILTIN pin from the internal boards definition as default feedback LED + IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); + Serial.print(F("Ready to receive IR signals ")); + Serial.print("at pin "); + Serial.println(IR_RECEIVE_PIN); + +} + +void loop() { + // put your main code here, to run repeatedly: + if (IrReceiver.decode()) { // Grab an IR code + // At 115200 baud, printing takes 200 ms for NEC protocol and 70 ms for NEC repeat + ir_state = true; + Serial.println(); // blank line between entries + Serial.println(); // 2 blank lines between entries + IrReceiver.printIRResultShort(&Serial); + if (IrReceiver.decodedIRData.flags & IRDATA_FLAGS_WAS_OVERFLOW) { + Serial.print("Try to increase the \"RAW_BUFFER_LENGTH\" value of "); + Serial.println(RAW_BUFFER_LENGTH); + // see also https://github.com/Arduino-IRremote/Arduino-IRremote#compile-options--macros-for-this-library + } else { + Serial.println(); + Serial.println("IR signal received!"); + IrReceiver.printIRResultRawFormatted(&Serial, true); // Output the results in RAW format + ir_count += 1; + Serial.print("Signal count: "); + Serial.println(ir_count); + Serial.println(); + } + IrReceiver.resume(); + } + else { + ir_state = false; + } + +} diff --git a/STEMMA_IR_Demodulator_Examples/CircuitPython/code.py b/STEMMA_IR_Demodulator_Examples/CircuitPython/code.py new file mode 100644 index 000000000..a54a6cc25 --- /dev/null +++ b/STEMMA_IR_Demodulator_Examples/CircuitPython/code.py @@ -0,0 +1,31 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import pulseio +import board + +pulses = pulseio.PulseIn(board.D5) +pulse = False +pulse_count = 0 + +while True: + + # Wait for an active pulse + while len(pulses) == 0: + if pulse: + pulse = False + + if len(pulses) != 0 and not pulse: + pulse_count += 1 + print(f"pulses detected {pulse_count} times") + pulse = True + # Pause while we do something with the pulses + pulses.pause() + # Print the pulses. pulses[0] is an active pulse unless the length + # reached max length and idle pulses are recorded. + print(pulses[0]) + # Clear the rest + pulses.clear() + # Resume with an 80 microsecond active pulse + pulses.resume(80) diff --git a/STEMMA_IR_LED_Emitter/code.py b/STEMMA_IR_LED_Emitter/code.py index 599daab27..b2294ac74 100644 --- a/STEMMA_IR_LED_Emitter/code.py +++ b/STEMMA_IR_LED_Emitter/code.py @@ -10,16 +10,17 @@ import adafruit_irremote # Create a 'PulseOut' to send infrared signals on the IR transmitter @ 38KHz pulseout = pulseio.PulseOut(board.D5, frequency=38000, duty_cycle=2**15) # Create an encoder that will take numbers and turn them into NEC IR pulses -emitter = adafruit_irremote.GenericTransmit( - header=[9500, 4500], one=[550, 550], zero=[550, 1700], trail=0 -) +encoder = adafruit_irremote.GenericTransmit(header=[9000, 4500], + one=[560, 1700], + zero=[560, 560], + trail=0) # count variable count = 0 while True: # send IR pulse - emitter.transmit(pulseout, [255, 2, 255, 0]) + encoder.transmit(pulseout, [255, 2, 255, 0]) # increase count count += 1 # print to REPL diff --git a/STEMMA_IR_Remote_Receiver_Examples/Arduino_STEMMA_IR_Remote_Receiver/.uno.test.only b/STEMMA_IR_Remote_Receiver_Examples/Arduino_STEMMA_IR_Remote_Receiver/.uno.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/STEMMA_IR_Remote_Receiver_Examples/Arduino_STEMMA_IR_Remote_Receiver/Arduino_STEMMA_IR_Remote_Receiver.ino b/STEMMA_IR_Remote_Receiver_Examples/Arduino_STEMMA_IR_Remote_Receiver/Arduino_STEMMA_IR_Remote_Receiver.ino new file mode 100644 index 000000000..855904fa9 --- /dev/null +++ b/STEMMA_IR_Remote_Receiver_Examples/Arduino_STEMMA_IR_Remote_Receiver/Arduino_STEMMA_IR_Remote_Receiver.ino @@ -0,0 +1,46 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/* + * Based on the SimpleReceiver.cpp from the + * Arduino-IRremote https://github.com/Arduino-IRremote/Arduino-IRremote. + * by Armin Joachimsmeyer + ************************************************************************************ + * MIT License + * + * Copyright (c) 2020-2023 Armin Joachimsmeyer + * + */ + +#include + +#include // include the library +#define IR_RECEIVE_PIN 5 + +void setup() { + Serial.begin(115200); + IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); +} + +void loop() { + /* + * Check if received data is available and if yes, try to decode it. + * Decoded result is in the IrReceiver.decodedIRData structure. + * + * E.g. command is in IrReceiver.decodedIRData.command + * address is in command is in IrReceiver.decodedIRData.address + * and up to 32 bit raw data in IrReceiver.decodedIRData.decodedRawData + */ + if (IrReceiver.decode()) { + if (IrReceiver.decodedIRData.protocol == UNKNOWN) { + IrReceiver.printIRResultRawFormatted(&Serial, true); + IrReceiver.resume(); + } else { + IrReceiver.resume(); + IrReceiver.printIRResultShort(&Serial); + IrReceiver.printIRSendUsage(&Serial); + } + Serial.println(); + } +} diff --git a/STEMMA_IR_Remote_Receiver_Examples/CircuitPython/code.py b/STEMMA_IR_Remote_Receiver_Examples/CircuitPython/code.py new file mode 100644 index 000000000..2c16476d0 --- /dev/null +++ b/STEMMA_IR_Remote_Receiver_Examples/CircuitPython/code.py @@ -0,0 +1,28 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import board +import pulseio +import adafruit_irremote + +# IR receiver setup +ir_receiver = pulseio.PulseIn(board.D5, maxlen=120, idle_state=True) +decoder = adafruit_irremote.GenericDecode() + +def decode_ir_signals(p): + codes = decoder.decode_bits(p) + return codes + +while True: + pulses = decoder.read_pulses(ir_receiver) + try: + # Attempt to decode the received pulses + received_code = decode_ir_signals(pulses) + if received_code: + hex_code = ''.join(["%02X" % x for x in received_code]) + print(f"Received: {hex_code}") + except adafruit_irremote.IRNECRepeatException: # Signal was repeated, ignore + pass + except adafruit_irremote.IRDecodeException: # Failed to decode signal + print("Error decoding") diff --git a/STEMMA_IR_Remote_Receiver_Examples/CircuitPython_ProductDemo/code.py b/STEMMA_IR_Remote_Receiver_Examples/CircuitPython_ProductDemo/code.py new file mode 100644 index 000000000..b0a55dd36 --- /dev/null +++ b/STEMMA_IR_Remote_Receiver_Examples/CircuitPython_ProductDemo/code.py @@ -0,0 +1,67 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: MIT +# +# Product demo for the IR Remote Receiver with an ESP32-S2 TFT + +import board +import terminalio +import displayio +import digitalio +import pulseio +import adafruit_irremote +try: + from fourwire import FourWire +except ImportError: + from displayio import FourWire +from adafruit_display_text import label +from adafruit_st7789 import ST7789 + +displayio.release_displays() + +# TFT display setup +spi = board.SPI() +tft_cs = board.TFT_CS # Adjust to your CS pin +tft_dc = board.TFT_DC # Adjust to your DC pin +display_bus = FourWire(spi, command=tft_dc, chip_select=tft_cs) +display = ST7789( + display_bus, rotation=270, width=240, height=135, rowstart=40, colstart=53 +) + +# Enable the display backlight +backlight = board.TFT_BACKLIGHT # Adjust to your backlight pin +backlight = digitalio.DigitalInOut(backlight) +backlight.switch_to_output() +backlight.value = True + +# Display initial text +text_area = label.Label(terminalio.FONT, text="Waiting\nfor IR...", color=0xFFFFFF) +text_area.anchor_point = (0.5, 0.5) +text_area.anchored_position = (240 / 2, 135 / 2) # Assuming display size is 240x135 +text_area.scale = 3 # Scale the text size up by 3 times + +display.root_group = text_area + +# IR receiver setup +# Adjust to your IR receiver pin +ir_receiver = pulseio.PulseIn(board.D5, maxlen=120, idle_state=True) +decoder = adafruit_irremote.GenericDecode() + +def decode_ir_signals(p): + codes = decoder.decode_bits(p) + return codes + +while True: + pulses = decoder.read_pulses(ir_receiver) + try: + # Attempt to decode the received pulses + received_code = decode_ir_signals(pulses) + # Update display with the received code + if received_code: + hex_code = ''.join(["%02X" % x for x in received_code]) + text_area.text = f"Received:\n{hex_code}" + print(f"Received: {hex_code}") + except adafruit_irremote.IRNECRepeatException: # Signal was repeated, ignore + pass + except adafruit_irremote.IRDecodeException: # Failed to decode signal + text_area.text = "Error decoding" diff --git a/STEMMA_IR_Transceiver_Examples/Arduino_STEMMA_IR_Transceiver/.uno.test.only b/STEMMA_IR_Transceiver_Examples/Arduino_STEMMA_IR_Transceiver/.uno.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/STEMMA_IR_Transceiver_Examples/Arduino_STEMMA_IR_Transceiver/Arduino_STEMMA_IR_Transceiver.ino b/STEMMA_IR_Transceiver_Examples/Arduino_STEMMA_IR_Transceiver/Arduino_STEMMA_IR_Transceiver.ino new file mode 100644 index 000000000..ca83b65d4 --- /dev/null +++ b/STEMMA_IR_Transceiver_Examples/Arduino_STEMMA_IR_Transceiver/Arduino_STEMMA_IR_Transceiver.ino @@ -0,0 +1,64 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/* + * Based on the SimpleReceiver.cpp and SimpleSender.cpp from the + * Arduino-IRremote https://github.com/Arduino-IRremote/Arduino-IRremote. + * by Armin Joachimsmeyer + ************************************************************************************ + * MIT License + * + * Copyright (c) 2020-2023 Armin Joachimsmeyer + * + */ + +#include + +#include // include the library +#define IR_RECEIVE_PIN 5 +#define IR_SEND_PIN 6 + +void setup() { + Serial.begin(115200); + while (!Serial) + ; + Serial.println("Adafruit STEMMA IR Transceiver Demo"); + IrReceiver.begin(IR_RECEIVE_PIN); + IrSender.begin(IR_SEND_PIN); // Start with IR_SEND_PIN -which is defined in PinDefinitionsAndMore.h- as send pin and enable feedback LED at default feedback LED pin + Serial.print("IRin on pin "); + Serial.print(IR_RECEIVE_PIN); + Serial.print(", IRout on pin "); + Serial.println(IR_SEND_PIN); +} + +uint8_t sCommand = 0x34; +uint8_t sRepeats = 0; + +void loop() { + /* + * Check if received data is available and if yes, try to decode it. + * Decoded result is in the IrReceiver.decodedIRData structure. + * + * E.g. command is in IrReceiver.decodedIRData.command + * address is in command is in IrReceiver.decodedIRData.address + * and up to 32 bit raw data in IrReceiver.decodedIRData.decodedRawData + */ + if (IrReceiver.decode()) { + if (IrReceiver.decodedIRData.protocol == UNKNOWN) { + IrReceiver.printIRResultRawFormatted(&Serial, true); + IrReceiver.resume(); + } else { + IrReceiver.resume(); + IrReceiver.printIRResultShort(&Serial); + IrReceiver.printIRSendUsage(&Serial); + delay(1000); + Serial.println("Sending received command.."); + IrSender.sendNEC(IrReceiver.lastDecodedProtocol, IrReceiver.lastDecodedCommand, IrReceiver.repeatCount); + delay(1000); + Serial.print("Sent!"); + //Serial.println(IrReceiver.lastDecodedProtocol, IrReceiver.lastDecodedCommand, IrReceiver.repeatCount); + } + Serial.println(); + } +} diff --git a/STEMMA_IR_Transceiver_Examples/CircuitPython/code.py b/STEMMA_IR_Transceiver_Examples/CircuitPython/code.py new file mode 100644 index 000000000..3ffdc6f97 --- /dev/null +++ b/STEMMA_IR_Transceiver_Examples/CircuitPython/code.py @@ -0,0 +1,40 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# SPDX-License-Identifier: MIT + +import time +import array +import pulseio +import board +import adafruit_irremote + +# Create a 'PulseOut' to send infrared signals on the IR transmitter @ 38KHz +pulseout = pulseio.PulseOut(board.D6, frequency=38000, duty_cycle=2**15) +# Create an encoder that will take numbers and turn them into NEC IR pulses +encoder = adafruit_irremote.GenericTransmit(header=[9000, 4500], + one=[560, 1700], + zero=[560, 560], + trail=0) +# IR receiver setup +ir_receiver = pulseio.PulseIn(board.D5, maxlen=120, idle_state=True) +decoder = adafruit_irremote.GenericDecode() + +while True: + pulses = decoder.read_pulses(ir_receiver) + try: + # Attempt to decode the received pulses + received_code = decoder.decode_bits(pulses) + if received_code: + hex_code = ''.join(["%02X" % x for x in received_code]) + print(f"Received: {hex_code}") + # Convert pulses to an array of type 'H' (unsigned short) + pulse_array = array.array('H', pulses) + # send code back using original pulses + pulseout.send(pulse_array) + print(f"Sent: {pulse_array}") + except adafruit_irremote.IRNECRepeatException: # Signal was repeated, ignore + pass + except adafruit_irremote.IRDecodeException: # Failed to decode signal + print("Error decoding") + ir_receiver.clear() # Clear the receiver buffer + time.sleep(1) # Delay to allow the receiver to settle + print() diff --git a/STEMMA_TCRT1000/CircuitPython/code.py b/STEMMA_TCRT1000/CircuitPython/code.py new file mode 100644 index 000000000..d487c53c2 --- /dev/null +++ b/STEMMA_TCRT1000/CircuitPython/code.py @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2023 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +from digitalio import DigitalInOut, Direction, Pull + +ir = DigitalInOut(board.D5) +ir.direction = Direction.INPUT +ir.pull = Pull.UP + +while True: + if not ir.value: + print("object detected!") + else: + print("waiting for object...") + time.sleep(0.01) diff --git a/STEMMA_TCRT1000/arduino_tcrt1000_demo/.uno.test.only b/STEMMA_TCRT1000/arduino_tcrt1000_demo/.uno.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/STEMMA_TCRT1000/arduino_tcrt1000_demo/arduino_tcrt1000_demo.ino b/STEMMA_TCRT1000/arduino_tcrt1000_demo/arduino_tcrt1000_demo.ino new file mode 100644 index 000000000..4a356f20a --- /dev/null +++ b/STEMMA_TCRT1000/arduino_tcrt1000_demo/arduino_tcrt1000_demo.ino @@ -0,0 +1,21 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +void setup() { + //start serial connection + Serial.begin(115200); + pinMode(5, INPUT_PULLUP); + +} + +void loop() { + int sensorVal = digitalRead(5); + + if (sensorVal == LOW) { + Serial.println("object detected!"); + } else { + Serial.println("waiting for object.."); + } + delay(200); +} diff --git a/Servo_Commander/code.py b/Servo_Commander/code.py new file mode 100644 index 000000000..e99a8df67 --- /dev/null +++ b/Servo_Commander/code.py @@ -0,0 +1,212 @@ +# SPDX-FileCopyrightText: 2024 johnpark for Adafruit Industries +# +# SPDX-License-Identifier: MIT +''' +Servo Commander +- Feather Reverse TFT ESP32-S3 + two servos + two push encoders +- test servo ranges with encoder rotation +- store saved positions with enc button + D0, D1, D2 buttons +- recall saved positions with D0, D1, D2 +- playback animation by pressing both push encoders +''' + +import time +import board +import displayio +import terminalio +from adafruit_display_text import label +from adafruit_display_shapes.rect import Rect +import rotaryio +import pwmio +from adafruit_motor import servo +import keypad + +# Define custom servo pulse range variables +s_cfgs = [ + {'min_pulse': 600, 'max_pulse': 2400, 'min_ang': 10, 'max_ang': 170}, + {'min_pulse': 600, 'max_pulse': 2300, 'min_ang': 10, 'max_ang': 170} +] + +# Setup the PWM output for the servos +pwm_pins = [board.D10, board.D11] +servo_motors = [] + +for i, config in enumerate(s_cfgs): + pwm = pwmio.PWMOut(pwm_pins[i], duty_cycle=2**15, frequency=50) + servo_motor = servo.Servo(pwm, min_pulse=config['min_pulse'], max_pulse=config['max_pulse']) + servo_motors.append(servo_motor) + servo_motor.angle = 90 + +s_saves = [ + [s_cfgs[0]['min_ang'], 90, s_cfgs[0]['max_ang']], + [s_cfgs[1]['min_ang'], 90, s_cfgs[1]['max_ang']] +] + +# Setup the rotary encs +encs = [ + rotaryio.IncrementalEncoder(board.A2, board.A1), + rotaryio.IncrementalEncoder(board.A5, board.A4) +] + +for enc in encs: + enc.position = 90 + +last_positions = [enc.position for enc in encs] + +# Setup the buttons +enc_buttons = keypad.Keys((board.D13, board.D12), value_when_pressed=False, pull=True) +tft_d0_button = keypad.Keys((board.D0,), value_when_pressed=False, pull=True) +tft_buttons = keypad.Keys((board.D1, board.D2), value_when_pressed=True, pull=True) + +def set_servo_angle(s_servo_motor, s_angle, s_enc, min_ang, max_ang): + s_angle = min(max(s_angle, min_ang), max_ang) + s_servo_motor.angle = s_angle + s_enc.position = s_angle + +def playback(mode, speed, steps): + for k in range(3): # Loop through each save position (assuming 3 saves per motor) + for m in range(len(servo_motors)): + p_servo_motor = servo_motors[m] + p_enc = encs[m] + save = s_saves[m][k] # Get the k-th save position for the m-th motor + + if mode: + direction = 1 if save > enc.position else -1 + for p_angle in range(enc.position, save, direction * steps): + p_servo_motor.angle = p_angle + time.sleep(speed) + p_enc.position = save + else: + servo_motor.angle = save + time.sleep(0.75) + + +# Setup the display +display = board.DISPLAY +group = displayio.Group() +background_rect = Rect(0, 10, display.width, display.height - 10, fill=0x000010) +group.append(background_rect) +mid_bar = Rect(116, 0, 3, display.height, fill=0x00000) +group.append(mid_bar) +top_bar = Rect(0, 0, display.width, 20, fill=0x000000) +group.append(top_bar) + +FONT = terminalio.FONT +TXTCOL = 0xFFFF00 + +# Create labels +labels = [] +for i, config in enumerate(s_cfgs): + lbl = label.Label(FONT, text=f"Pulse: {config['min_pulse']}-{config['max_pulse']}",color=TXTCOL, + scale=1, anchor_point=(0, 0), anchored_position=(5 + 125 * i, 5)) + labels.append(lbl) + group.append(lbl) + +for i in range(2): + lbl = label.Label(FONT, text="Angle:-", color=TXTCOL, scale=2, anchor_point=(0, 0), + anchored_position=(4 + 126 * i, 24)) + labels.append(lbl) + group.append(lbl) + +for i in range(2): + for j in range(3): + lbl = label.Label(FONT, text=f"D{j}:{s_saves[i][j]}", color=TXTCOL, scale=2, + anchor_point=(0, 0), anchored_position=(4 + i * 126, 48 + 24 * j)) + labels.append(lbl) + group.append(lbl) + +display.root_group = group + +modifier1 = False +modifier2 = False + +print("[]-Servo Commander READY-[]") + +while True: + enc_button_event = enc_buttons.events.get() + if enc_button_event: + if enc_button_event.pressed: + if enc_button_event.key_number == 0: + modifier1 = True + elif enc_button_event.key_number == 1: + modifier2 = True + + if enc_button_event.released: + if enc_button_event.key_number == 0: + modifier1 = False + elif enc_button_event.key_number == 1: + modifier2 = False + + if modifier1 and modifier2: + print("Playback") + playback(True, 0.006, 2) + + tft_d0_button_event = tft_d0_button.events.get() + if tft_d0_button_event and tft_d0_button_event.pressed: + if modifier1: + s_saves[0][0] = min(max(encs[0].position, s_cfgs[0]['min_ang']), s_cfgs[0]['max_ang']) + print("D0 save motor1:", s_saves[0][0]) + labels[4].text = f"D0:{s_saves[0][0]}" + elif modifier2: + s_saves[1][0] = min(max(encs[1].position, s_cfgs[1]['min_ang']), s_cfgs[1]['max_ang']) + print("D0 save motor2:", s_saves[1][0]) + labels[7].text = f"D0:{s_saves[1][0]}" + else: + for i in range(len(servo_motors)): + servo_motor = servo_motors[i] + enc = encs[i] + s_save = s_saves[i][0] + config = s_cfgs[i] + print(f"D0 recalled motor{i+1}:", s_save) + set_servo_angle(servo_motor, s_save, enc, config['min_ang'], config['max_ang']) + labels[2 + i].text = f"Angle:{s_save}" + + tft_buttons_event = tft_buttons.events.get() + if tft_buttons_event and tft_buttons_event.pressed: + if tft_buttons_event.key_number == 0: + if modifier1: + s_saves[0][1] = min(max(encs[0].position,s_cfgs[0]['min_ang']),s_cfgs[0]['max_ang']) + print("D1 save motor1:", s_saves[0][1]) + labels[5].text = f"D1:{s_saves[0][1]}" + elif modifier2: + s_saves[1][1] = min(max(encs[1].position,s_cfgs[1]['min_ang']),s_cfgs[1]['max_ang']) + print("D1 save motor2:", s_saves[1][1]) + labels[8].text = f"D1:{s_saves[1][1]}" + else: + for i in range(len(servo_motors)): + servo_motor = servo_motors[i] + enc = encs[i] + s_save = s_saves[i][1] + config = s_cfgs[i] + print(f"D1 recalled motor{i+1}:", s_save) + set_servo_angle(servo_motor, s_save, enc, config['min_ang'], config['max_ang']) + labels[2 + i].text = f"Angle:{s_save}" + elif tft_buttons_event.key_number == 1: + if modifier1: + s_saves[0][2] = min(max(encs[0].position,s_cfgs[0]['min_ang']),s_cfgs[0]['max_ang']) + print("D2 save motor1:", s_saves[0][2]) + labels[6].text = f"D2:{s_saves[0][2]}" + elif modifier2: + s_saves[1][2] = min(max(encs[1].position,s_cfgs[1]['min_ang']),s_cfgs[1]['max_ang']) + print("D2 save motor2:", s_saves[1][2]) + labels[9].text = f"D2:{s_saves[1][2]}" + else: + for i in range(len(servo_motors)): + servo_motor = servo_motors[i] + enc = encs[i] + s_save = s_saves[i][2] + config = s_cfgs[i] + print(f"D2 recalled motor{i+1}:", s_save) + set_servo_angle(servo_motor, s_save, enc, config['min_ang'], config['max_ang']) + labels[2 + i].text = f"Angle:{s_save}" + + for i in range(len(servo_motors)): + current_position = encs[i].position + if current_position != last_positions[i]: + config = s_cfgs[i] + angle = min(max(current_position, config['min_ang']), config['max_ang']) + servo_motor = servo_motors[i] + enc = encs[i] + set_servo_angle(servo_motor, angle, enc, config['min_ang'], config['max_ang']) + labels[2 + i].text = f"Angle:{angle}" + last_positions[i] = current_position diff --git a/Soundboard_Scooter_Bike/code.py b/Soundboard_Scooter_Bike/code.py index b6d83b86b..03a9a2918 100755 --- a/Soundboard_Scooter_Bike/code.py +++ b/Soundboard_Scooter_Bike/code.py @@ -28,7 +28,7 @@ KEY_PINS = ( km = keypad.Keys( KEY_PINS, value_when_pressed=False, pull=True) -audio = audiobusio.I2SOut(board.D1, board.D0, board.D9) +audio = audiobusio.I2SOut(board.TX, board.RX, board.D9) mixer = audiomixer.Mixer(voice_count=len(wav_files), sample_rate=22050, channel_count=1, bits_per_sample=16, samples_signed=True) diff --git a/Sparkle_Motion_Examples/Arduino_I2S_SparkleMotion/.feather_esp32_v2.test.only b/Sparkle_Motion_Examples/Arduino_I2S_SparkleMotion/.feather_esp32_v2.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Sparkle_Motion_Examples/Arduino_I2S_SparkleMotion/Arduino_I2S_SparkleMotion.ino b/Sparkle_Motion_Examples/Arduino_I2S_SparkleMotion/Arduino_I2S_SparkleMotion.ino new file mode 100644 index 000000000..2b7a4c791 --- /dev/null +++ b/Sparkle_Motion_Examples/Arduino_I2S_SparkleMotion/Arduino_I2S_SparkleMotion.ino @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2025 Limor Fried for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include "ESP_I2S.h" + +// I2S pin definitions for Sparklemotion +const uint8_t I2S_SCK = 26; // BCLK +const uint8_t I2S_WS = 33; // LRCLK +const uint8_t I2S_DIN = 25; // DATA_IN + +// Create I2S instance +I2SClass i2s; + +void setup() { + // Fast serial for plotting + Serial.begin(500000); + + // Initialize I2S + i2s.setPins(I2S_SCK, I2S_WS, -1, I2S_DIN); + if (!i2s.begin(I2S_MODE_STD, 44100, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO, I2S_STD_SLOT_LEFT)) { + Serial.println("Failed to initialize I2S bus!"); + return; + } + + Serial.println("I2S Mic Plotter Ready"); +} + +void loop() { + static uint32_t lastPlot = 0; + + // Get a sample + int32_t sample = i2s.read(); + + // Only plot every 1ms (1000 samples/sec is plenty for visualization) + if (millis() - lastPlot >= 1) { + if (sample >= 0) { // Valid sample + // Plot both raw and absolute values + Serial.printf("%d,%d\n", (int16_t)sample, abs((int16_t)sample)); + } + lastPlot = millis(); + } +} diff --git a/Sparkle_Motion_Examples/Arduino_Sparkle_Motion_IR_Remote/.feather_esp32_v2.test.only b/Sparkle_Motion_Examples/Arduino_Sparkle_Motion_IR_Remote/.feather_esp32_v2.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Sparkle_Motion_Examples/Arduino_Sparkle_Motion_IR_Remote/Arduino_Sparkle_Motion_IR_Remote.ino b/Sparkle_Motion_Examples/Arduino_Sparkle_Motion_IR_Remote/Arduino_Sparkle_Motion_IR_Remote.ino new file mode 100644 index 000000000..b8ebca066 --- /dev/null +++ b/Sparkle_Motion_Examples/Arduino_Sparkle_Motion_IR_Remote/Arduino_Sparkle_Motion_IR_Remote.ino @@ -0,0 +1,89 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// SPDX-FileCopyrightText: 2025 Tim Cocks for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/* + * Based on the SimpleReceiver.cpp and SimpleSender.cpp from the + * Arduino-IRremote https://github.com/Arduino-IRremote/Arduino-IRremote. + * by Armin Joachimsmeyer + ************************************************************************************ + * MIT License + * + * Copyright (c) 2020-2023 Armin Joachimsmeyer + * + */ + +#include + +#include // include the library +#include + +#define NEOPIXEL_STRIP_PIN 21 +#define NUM_PIXELS 8 + +#define IR_RECEIVE_PIN 32 + +Adafruit_NeoPixel NEOPIXEL_STRIP(NUM_PIXELS, NEOPIXEL_STRIP_PIN, NEO_GRB + NEO_KHZ800); + +uint8_t upCmd = 0x5; +uint8_t downCmd = 0xD; +uint8_t rightCmd = 0xA; +uint8_t leftCmd = 0x8; + +uint16_t pixelHue = 0; +uint8_t brightness = 25; + +void setup() { + Serial.begin(115200); + while (!Serial) + ; + Serial.println("Adafruit Sparkle Motion IR Remote Control NeoPixels Demo"); + IrReceiver.begin(IR_RECEIVE_PIN); + Serial.print("IRin on pin "); + Serial.print(IR_RECEIVE_PIN); + NEOPIXEL_STRIP.begin(); + NEOPIXEL_STRIP.setBrightness(25); +} + +void loop() { + /* + * Check if received data is available and if yes, try to decode it. + * When left or right buttons are pressed, change the pixelHue. + * When up or down buttons are pressed, change the brightness. + */ + if (IrReceiver.decode()) { + if (IrReceiver.decodedIRData.protocol == UNKNOWN) { + Serial.println("unknown"); + IrReceiver.printIRResultRawFormatted(&Serial, true); + IrReceiver.resume(); + } else { + IrReceiver.resume(); + //IrReceiver.printIRResultShort(&Serial); + + // Ignore repeat codes from holding down the button + if (IrReceiver.decodedIRData.flags == 0){ + //Serial.printf("Command: %d\n",IrReceiver.decodedIRData.command); + if (IrReceiver.decodedIRData.command == upCmd){ + Serial.println("UP btn"); + brightness = min(brightness + 25, 255); + }else if (IrReceiver.decodedIRData.command == downCmd){ + Serial.println("DOWN btn"); + brightness = max(brightness - 25, 0); + }else if (IrReceiver.decodedIRData.command == leftCmd){ + Serial.println("LEFT btn"); + pixelHue = (pixelHue - 8192) % 65536; + }else if (IrReceiver.decodedIRData.command == rightCmd){ + Serial.println("RIGHT btn"); + pixelHue = (pixelHue + 8192) % 65536; + } + + NEOPIXEL_STRIP.setBrightness(brightness); + NEOPIXEL_STRIP.fill(NEOPIXEL_STRIP.gamma32(NEOPIXEL_STRIP.ColorHSV(pixelHue))); + NEOPIXEL_STRIP.show(); + delay(100); + } + } + Serial.println(); + } +} diff --git a/Sparkle_Motion_Examples/Arduino_Sparkle_Motion_Multi_NeoPixels/Arduino_Sparkle_Motion_Multi_NeoPixels.ino b/Sparkle_Motion_Examples/Arduino_Sparkle_Motion_Multi_NeoPixels/Arduino_Sparkle_Motion_Multi_NeoPixels.ino new file mode 100644 index 000000000..af8651820 --- /dev/null +++ b/Sparkle_Motion_Examples/Arduino_Sparkle_Motion_Multi_NeoPixels/Arduino_Sparkle_Motion_Multi_NeoPixels.ino @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +#define BLOCK_1 21 +#define BLOCK_2 22 +#define NUM_PIXELS 8 + +Adafruit_NeoPixel STRIP_1(NUM_PIXELS, BLOCK_1, NEO_GRB + NEO_KHZ800); +Adafruit_NeoPixel STRIP_2(NUM_PIXELS, BLOCK_2, NEO_GRB + NEO_KHZ800); + +void setup() { + STRIP_1.begin(); + STRIP_2.begin(); + STRIP_1.setBrightness(25); + STRIP_2.setBrightness(50); +} + +uint16_t pixelHue_1 = 0; +uint16_t pixelHue_2 = 256; + +void loop() { + pixelHue_1 += 256; + for(int i=0; i-1; i--) { + int hue_2 = pixelHue_2 + (i * 65536L / STRIP_2.numPixels()); + STRIP_2.setPixelColor(i, STRIP_2.gamma32(STRIP_2.ColorHSV(hue_2))); + } + STRIP_2.show(); + + delay(10); + +} diff --git a/Sparkle_Motion_Examples/CircuitPython_Sparkle_Motion_IR_Remote/code.py b/Sparkle_Motion_Examples/CircuitPython_Sparkle_Motion_IR_Remote/code.py new file mode 100644 index 000000000..48bbce7db --- /dev/null +++ b/Sparkle_Motion_Examples/CircuitPython_Sparkle_Motion_IR_Remote/code.py @@ -0,0 +1,54 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-FileCopyrightText: 2025 Tim Cocks for Adafruit Industries +# SPDX-License-Identifier: MIT +"""CircuitPython Adafruit Sparkle Motion IR remote control NeoPixels example.""" +import time + +import board +import pulseio +from rainbowio import colorwheel + +import neopixel +import adafruit_irremote + +pulsein = pulseio.PulseIn(board.IR, maxlen=120, idle_state=True) +decoder = adafruit_irremote.NonblockingGenericDecode(pulsein) + +IR_CODE_UP = (0, 253, 160, 95) +IR_CODE_DOWN = (0, 253, 176, 79) + +IR_CODE_RIGHT = (0, 253, 80, 175) +IR_CODE_LEFT = (0, 253, 16, 239) + +t0 = next_heartbeat = time.monotonic() + +pixel = neopixel.NeoPixel(board.D21, 8) + +brightness = 1 +pixel.brightness = brightness / 10 + +color_number = 160 +pixel.fill(colorwheel(color_number)) +while True: + for message in decoder.read(): + print(f"t={time.monotonic() - t0:.3} New IR Message") + if isinstance(message, adafruit_irremote.IRMessage): + if message.code == IR_CODE_UP: + brightness = min(brightness + 1, 10) + elif message.code == IR_CODE_DOWN: + brightness = max(brightness - 1, 0) + elif message.code == IR_CODE_RIGHT: + color_number = (color_number + 32) % 256 + elif message.code == IR_CODE_LEFT: + color_number = (color_number - 32) % 256 + + pixel.brightness = brightness / 10 + pixel.fill(colorwheel(color_number)) + + print("Decoded:", message.code) + print("Brightness: ", brightness/10, " Color: ", hex(colorwheel(color_number))) + elif isinstance(message, adafruit_irremote.NECRepeatIRMessage): + print("NEC repeat!") + elif isinstance(message, adafruit_irremote.UnparseableIRMessage): + print("Failed to decode", message.reason) + print("----------------------------") diff --git a/Sparkle_Motion_Examples/CircuitPython_Sparkle_Motion_Neopixel_Animation/code.py b/Sparkle_Motion_Examples/CircuitPython_Sparkle_Motion_Neopixel_Animation/code.py new file mode 100644 index 000000000..e08c423bf --- /dev/null +++ b/Sparkle_Motion_Examples/CircuitPython_Sparkle_Motion_Neopixel_Animation/code.py @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: 2025 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT +""" +Example illustrating two different LED Animations running on +Neopixels connected to 2 of the main outputs of the Sparkle Motion +""" +import board +import neopixel + +from adafruit_led_animation.animation.comet import Comet +from adafruit_led_animation.animation.rainbow import Rainbow +from adafruit_led_animation.color import GREEN + +strip1_pixel_pin = board.D21 +strip2_pixel_pin = board.D22 + +pixel_count = 8 + +strip1_pixels = neopixel.NeoPixel( + strip1_pixel_pin, pixel_count, brightness=0.1, auto_write=False +) +strip2_pixels = neopixel.NeoPixel( + strip2_pixel_pin, pixel_count, brightness=0.1, auto_write=False +) + +comet = Comet(strip1_pixels, speed=0.05, color=GREEN, tail_length=3, bounce=True) +rainbow = Rainbow(strip2_pixels, speed=0.05, period=3) + +while True: + comet.animate() + rainbow.animate() diff --git a/Sparkle_Motion_Mini_Examples/Arduino_I2S_SparkleMotionMini/.feather_esp32_v2.test.only b/Sparkle_Motion_Mini_Examples/Arduino_I2S_SparkleMotionMini/.feather_esp32_v2.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Sparkle_Motion_Mini_Examples/Arduino_I2S_SparkleMotionMini/Arduino_I2S_SparkleMotionMini.ino b/Sparkle_Motion_Mini_Examples/Arduino_I2S_SparkleMotionMini/Arduino_I2S_SparkleMotionMini.ino new file mode 100644 index 000000000..43f0fb478 --- /dev/null +++ b/Sparkle_Motion_Mini_Examples/Arduino_I2S_SparkleMotionMini/Arduino_I2S_SparkleMotionMini.ino @@ -0,0 +1,44 @@ +// SPDX-FileCopyrightText: 2025 Limor Fried for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include "ESP_I2S.h" + +// I2S pin definitions for Sparklemotion +const uint8_t I2S_SCK = 23; // BCLK +const uint8_t I2S_WS = 10; // LRCLK +const uint8_t I2S_DIN = 9; // DATA_IN + +// Create I2S instance +I2SClass i2s; + +void setup() { + // Fast serial for plotting + Serial.begin(500000); + + // Initialize I2S + i2s.setPins(I2S_SCK, I2S_WS, -1, I2S_DIN); + if (!i2s.begin(I2S_MODE_STD, 44100, I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO, I2S_STD_SLOT_LEFT)) { + Serial.println("Failed to initialize I2S bus!"); + return; + } + + Serial.println("I2S Mic Plotter Ready"); +} + +void loop() { + static uint32_t lastPlot = 0; + + // Get a sample + int32_t sample = i2s.read(); + + // Only plot every 1ms (1000 samples/sec is plenty for visualization) + if (millis() - lastPlot >= 1) { + if (sample >= 0) { // Valid sample + // Plot both raw and absolute values + Serial.printf("%d,%d\n", (int16_t)sample, abs((int16_t)sample)); + } + lastPlot = millis(); + } +} diff --git a/Sparkle_Motion_Mini_Examples/Arduino_Sparkle_Motion_Mini_Multi_NeoPixels/Arduino_Sparkle_Motion_Mini_Multi_NeoPixels.ino b/Sparkle_Motion_Mini_Examples/Arduino_Sparkle_Motion_Mini_Multi_NeoPixels/Arduino_Sparkle_Motion_Mini_Multi_NeoPixels.ino new file mode 100644 index 000000000..0c337ed4b --- /dev/null +++ b/Sparkle_Motion_Mini_Examples/Arduino_Sparkle_Motion_Mini_Multi_NeoPixels/Arduino_Sparkle_Motion_Mini_Multi_NeoPixels.ino @@ -0,0 +1,41 @@ +// SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include + +#define BLOCK_1 33 +#define BLOCK_2 32 +#define NUM_PIXELS 8 + +Adafruit_NeoPixel STRIP_1(NUM_PIXELS, BLOCK_1, NEO_GRB + NEO_KHZ800); +Adafruit_NeoPixel STRIP_2(NUM_PIXELS, BLOCK_2, NEO_GRB + NEO_KHZ800); + +void setup() { + STRIP_1.begin(); + STRIP_2.begin(); + STRIP_1.setBrightness(25); + STRIP_2.setBrightness(50); +} + +uint16_t pixelHue_1 = 0; +uint16_t pixelHue_2 = 256; + +void loop() { + pixelHue_1 += 256; + for(int i=0; i-1; i--) { + int hue_2 = pixelHue_2 + (i * 65536L / STRIP_2.numPixels()); + STRIP_2.setPixelColor(i, STRIP_2.gamma32(STRIP_2.ColorHSV(hue_2))); + } + STRIP_2.show(); + + delay(10); + +} diff --git a/Sparkle_Motion_Mini_Examples/CircuitPython_Sparkle_Motion_Mini_Neopixel_Animation/code.py b/Sparkle_Motion_Mini_Examples/CircuitPython_Sparkle_Motion_Mini_Neopixel_Animation/code.py new file mode 100644 index 000000000..1989c9bf5 --- /dev/null +++ b/Sparkle_Motion_Mini_Examples/CircuitPython_Sparkle_Motion_Mini_Neopixel_Animation/code.py @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: 2025 Tim Cocks for Adafruit Industries +# +# SPDX-License-Identifier: MIT +""" +Example illustrating two different LED Animations running on +Neopixels connected to the 2 main outputs of the Sparkle Motion Mini +""" +import board +import neopixel + +from adafruit_led_animation.animation.comet import Comet +from adafruit_led_animation.animation.rainbow import Rainbow +from adafruit_led_animation.color import GREEN + +strip1_pixel_pin = board.D33 +strip2_pixel_pin = board.D32 + +pixel_count = 8 + +strip1_pixels = neopixel.NeoPixel( + strip1_pixel_pin, pixel_count, brightness=0.1, auto_write=False +) +strip2_pixels = neopixel.NeoPixel( + strip2_pixel_pin, pixel_count, brightness=0.05, auto_write=False +) + +comet = Comet(strip1_pixels, speed=0.05, color=GREEN, tail_length=3, bounce=True) +rainbow = Rainbow(strip2_pixels, speed=0.05, period=3) + +while True: + comet.animate() + rainbow.animate() diff --git a/Spinning_Ikea_Pumpkin/code.py b/Spinning_Ikea_Pumpkin/code.py new file mode 100644 index 000000000..9e9cbdaf1 --- /dev/null +++ b/Spinning_Ikea_Pumpkin/code.py @@ -0,0 +1,105 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import microcontroller +import board +import audiocore +import audiobusio +import audiomixer +import pwmio +from digitalio import DigitalInOut, Direction, Pull +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff +from adafruit_motor import servo +import adafruit_vl53l1x + +distance_delay = 4 # how often vl53 is read +servo_delays = [2.0, 1.5, 1.0, 0.5] # servo spin delay +distances = [150, 100, 80, 40] # in centimeters +max_audio = 1 +# audio files +music = audiocore.WaveFile(open("music-loop-1.wav", "rb")) +fx_1 = audiocore.WaveFile(open("happy-halloween.wav", "rb")) +fx_2 = audiocore.WaveFile(open("laugh-2.wav", "rb")) +fx_3 = audiocore.WaveFile(open("laugh-3.wav", "rb")) + +i2c = board.STEMMA_I2C() +vl53 = adafruit_vl53l1x.VL53L1X(i2c) + +tracks = [music, fx_1, fx_2, fx_3] +audio = audiobusio.I2SOut(board.I2S_BIT_CLOCK, board.I2S_WORD_SELECT, board.I2S_DATA) +mixer = audiomixer.Mixer(voice_count=4, sample_rate=22050, channel_count=1, + bits_per_sample=16, samples_signed=True) +audio.play(mixer) +mixer.voice[0].play(tracks[0], loop=True) +mixer.voice[0].level = 0.0 + +# enable external power pin +# provides power to the external components +external_power = DigitalInOut(board.EXTERNAL_POWER) +external_power.direction = Direction.OUTPUT +external_power.value = True + +switch = DigitalInOut(board.EXTERNAL_BUTTON) +switch.direction = Direction.INPUT +switch.pull = Pull.UP + +# servo control +pwm = pwmio.PWMOut(board.EXTERNAL_SERVO, duty_cycle=2 ** 15, frequency=50) +servo = servo.ContinuousServo(pwm, min_pulse=750, max_pulse=2250) + +vl53.start_ranging() + +vl53_clock = ticks_ms() +vl53_time = distance_delay * 1000 +servo_clock = ticks_ms() +servo_time = int(servo_delays[0] * 1000) +prop_time = False +servo_throttle = 0 + +while True: + try: + if switch.value: + external_power.value = True + if prop_time: + if ticks_diff(ticks_ms(), servo_clock) >= servo_time: + print(servo_throttle) + servo.throttle = servo_throttle + servo_throttle = not servo_throttle + servo_clock = ticks_add(servo_clock, servo_time) + if ticks_diff(ticks_ms(), vl53_clock) >= vl53_time: + if vl53.data_ready: + print(f"Distance: {vl53.distance} cm") + vl53.clear_interrupt() + if vl53.distance is None: + prop_time = False + mixer.voice[0].level = 0.0 + servo_time = int(servo_delays[0] * 1000) + servo.throttle = 1.0 + else: + closest_distance = min(distances, key=lambda x: abs(vl53.distance - x)) + # print(closest_distance) + if vl53.distance <= distances[0]: + prop_time = True + mixer.voice[0].level = max_audio + else: + prop_time = False + mixer.voice[0].level = 0.0 + servo.throttle = 1.0 + if closest_distance == distances[1]: + mixer.voice[1].play(tracks[1], loop=False) + servo_time = int(servo_delays[1] * 1000) + elif closest_distance == distances[2]: + mixer.voice[2].play(tracks[2], loop=False) + servo_time = int(servo_delays[2] * 1000) + elif closest_distance == distances[3]: + mixer.voice[3].play(tracks[3], loop=False) + servo_time = int(servo_delays[3] * 1000) + vl53_clock = ticks_add(vl53_clock, vl53_time) + else: + external_power.value = False + except Exception as error: # pylint: disable=broad-except + print(error) + time.sleep(5) + microcontroller.reset() diff --git a/Spinning_Ikea_Pumpkin/happy-halloween.wav b/Spinning_Ikea_Pumpkin/happy-halloween.wav new file mode 100644 index 000000000..838bbf57a Binary files /dev/null and b/Spinning_Ikea_Pumpkin/happy-halloween.wav differ diff --git a/Spinning_Ikea_Pumpkin/laugh-1.wav b/Spinning_Ikea_Pumpkin/laugh-1.wav new file mode 100644 index 000000000..7d27419ae Binary files /dev/null and b/Spinning_Ikea_Pumpkin/laugh-1.wav differ diff --git a/Spinning_Ikea_Pumpkin/laugh-2.wav b/Spinning_Ikea_Pumpkin/laugh-2.wav new file mode 100644 index 000000000..0c5d47f0f Binary files /dev/null and b/Spinning_Ikea_Pumpkin/laugh-2.wav differ diff --git a/Spinning_Ikea_Pumpkin/laugh-3.wav b/Spinning_Ikea_Pumpkin/laugh-3.wav new file mode 100644 index 000000000..bc157388f Binary files /dev/null and b/Spinning_Ikea_Pumpkin/laugh-3.wav differ diff --git a/Spinning_Ikea_Pumpkin/music-loop-1.wav b/Spinning_Ikea_Pumpkin/music-loop-1.wav new file mode 100644 index 000000000..77d8a7af1 Binary files /dev/null and b/Spinning_Ikea_Pumpkin/music-loop-1.wav differ diff --git a/Spinning_Ikea_Pumpkin/music-loop-2.wav b/Spinning_Ikea_Pumpkin/music-loop-2.wav new file mode 100644 index 000000000..7dde9de1b Binary files /dev/null and b/Spinning_Ikea_Pumpkin/music-loop-2.wav differ diff --git a/Spinning_Ikea_Pumpkin/music-loop-3.wav b/Spinning_Ikea_Pumpkin/music-loop-3.wav new file mode 100644 index 000000000..028f82e88 Binary files /dev/null and b/Spinning_Ikea_Pumpkin/music-loop-3.wav differ diff --git a/TFT_FeatherWing_TSC2007_Demos/CircuitPython/code.py b/TFT_FeatherWing_TSC2007_Demos/CircuitPython/code.py index 6fdc2b0a1..c8c869484 100644 --- a/TFT_FeatherWing_TSC2007_Demos/CircuitPython/code.py +++ b/TFT_FeatherWing_TSC2007_Demos/CircuitPython/code.py @@ -51,7 +51,7 @@ for i in range(len(images)): index = 0 touch_state = False -display.show(groups[index]) +display.root_group = groups[index] while True: if tsc.touched and not touch_state: @@ -60,11 +60,11 @@ while True: # left side of the screen if point["y"] < 2000: index = (index - 1) % len(images) - display.show(groups[index]) + display.root_group = groups[index] # right side of the screen else: index = (index + 1) % len(images) - display.show(groups[index]) + display.root_group = groups[index] touch_state = True if not tsc.touched and touch_state: touch_state = False diff --git a/TFT_Shield_TSC2007_Demos/CircuitPython/code.py b/TFT_Shield_TSC2007_Demos/CircuitPython/code.py index 24fb8ba96..ccd2599c9 100644 --- a/TFT_Shield_TSC2007_Demos/CircuitPython/code.py +++ b/TFT_Shield_TSC2007_Demos/CircuitPython/code.py @@ -55,7 +55,7 @@ for i in range(len(images)): index = 0 touch_state = False -display.show(groups[index]) +display.root_group = groups[index] while True: if tsc.touched and not touch_state: point = tsc.touch @@ -66,10 +66,10 @@ while True: # left side of the screen if point["y"] < 2000: index = (index - 1) % len(images) - display.show(groups[index]) + display.root_group = groups[index] # right side of the screen else: index = (index + 1) % len(images) - display.show(groups[index]) + display.root_group = groups[index] if not tsc.touched and touch_state: touch_state = False diff --git a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/code.py b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/code.py new file mode 100644 index 000000000..dc5c778cd --- /dev/null +++ b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/code.py @@ -0,0 +1,98 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SpiritBoard code.py +Feather ESP32-S3 or S2 + TFT Featherwing 3.5" 480x320 pixels + +Receive and display messages from the spirits. +""" +# pylint: disable=import-error, invalid-name +import os +import displayio +import board +from digitalio import DigitalInOut +import adafruit_connection_manager +import wifi +import adafruit_requests +from adafruit_io.adafruit_io import IO_HTTP +from adafruit_hx8357 import HX8357 # TFT Featherwing 3.5" 480x320 display driver +import adafruit_tsc2007 + +from spirit_board import SpiritBoard + + + +# 3.5" TFT Featherwing is 480x320 +displayio.release_displays() +DISPLAY_WIDTH = 480 +DISPLAY_HEIGHT = 320 + +# Initialize TFT Display +spi = board.SPI() +tft_cs = board.D9 +tft_dc = board.D10 +display_bus = displayio.FourWire(spi, command=tft_dc, chip_select=tft_cs) +display = HX8357(display_bus, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT) +display.rotation = 0 +_touch_flip = (False, True) + +# Initialize 3.5" TFT Featherwing Touchscreen +ts_cs_pin = DigitalInOut(board.D6) +i2c = board.I2C() +tsc = adafruit_tsc2007.TSC2007(i2c, irq=None) + +try: + # Initialize a requests session + pool = adafruit_connection_manager.get_radio_socketpool(wifi.radio) + ssl_context = adafruit_connection_manager.get_radio_ssl_context(wifi.radio) + requests = adafruit_requests.Session(pool, ssl_context) + + # Set your Adafruit IO Username and Key in secrets.py + # (visit io.adafruit.com if you need to create an account, + # or if you need your Adafruit IO key.) + aio_username = os.getenv("AIO_USERNAME") + aio_key = os.getenv("AIO_KEY") + + # Initialize an Adafruit IO HTTP API object + io = IO_HTTP(aio_username, aio_key, requests) +except (RuntimeError, TypeError) as e: + print("could not connect to AP or AdafruitIO: ", e) + io = None + +# initialize the SpiritBoard class +spirit_board = SpiritBoard(display) + +# get messages from io or the local file +messages = spirit_board.get_messages(io) + +# The planchette is already at the home position. +# Slide it to home again to make it jump, in order +# indicate the message is ready to be received. +spirit_board.slide_planchette(SpiritBoard.LOCATIONS["home"], + delay=0.02, step_size=6) + +# current message index +message_index = 0 +while True: + # if the display was touched + if tsc.touched: + # write the message at the current index + spirit_board.write_message(messages[message_index], step_size=8) + + # if there are more messages in the list inside of context + if message_index < len(messages) - 1: + # increment the message index + message_index += 1 + + else: # there are no more messages in the list + # reset the index to 0 + message_index = 0 + print("fetching next") + + # fetch new messages + messages = spirit_board.get_messages(io) + + # make the planchette jump to indicate messages are ready to display + spirit_board.slide_planchette(SpiritBoard.LOCATIONS["home"], + delay=0.02, step_size=6) diff --git a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/planchette_v1.bmp b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/planchette_v1.bmp new file mode 100644 index 000000000..b36ff9c82 Binary files /dev/null and b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/planchette_v1.bmp differ diff --git a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py new file mode 100644 index 000000000..9a889f608 --- /dev/null +++ b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board.py @@ -0,0 +1,397 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SpiritBoard helper class +""" +import math +import os +import random +import time +import displayio + +# pylint: disable=import-error +from adafruit_anchored_tilegrid import AnchoredTileGrid +from adafruit_io.adafruit_io_errors import AdafruitIO_RequestError + + +class SpiritBoard(displayio.Group): + """ + DisplayIO Based SpiritBoard + + Holds and manages everything needed to draw the spirit board and planchette, as well + as move the planchette around to output messages from the spirits. + """ + # Mapping of letters and words on the board to their pixel coordinates. + # Points are centered on the target letter. + # Words can contain a list of points, the planchette will move between them. + LOCATIONS = {"a": (42, 145), "b": (63, 115), "c": (97, 97), "d": (133, 85), + "e": (172, 78), "f": (207, 75), "g": (245, 74), "h": (284, 75), + "i": (319, 80), "j": (345, 85), "k": (375, 95), "l": (410, 111), + "m": (435, 140), "n": (78, 190), "o": (96, 162), "p": (122, 145), + "q": (149, 132), "r": (179, 123), "s": (208, 118), "t": (235, 116), + "u": (267, 116), "v": (302, 119), "w": (334, 130), "x": (368, 147), + "y": (393, 168), "z": (405, 194), + " ": (151, 201), "<3": (247, 20), "?": (162, 18), "&": (339, 18), + "home": (234, 246), "yes": [(26, 20), (82, 20)], "no": [(418, 20), (450, 20)], + "hello": [(20, 300), (123, 300)], "goodbye": [(314, 300), (456, 300)]} + + # List of full words on the board (multi-character strings) + # used to know whether to parse the message + # one letter at a time, or with a full word. + FULL_WORDS = ["yes", "no", "hello", "goodbye", "home", "<3"] + + def __init__(self, display): + """ + Create a SpiritBoard instance and put it in the displays root_group to make it visible. + + :param displayio.Display display: Display object to show the spirit board on. + """ + self._display = display + super().__init__() + + # board image file + if display.width == 480 and display.height == 320: + self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_480x320.bmp") + elif display.width == 320 and display.height == 240: + self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_320x240.bmp") + self._convert_locations_for_small_screen() + self.spirit_board_tilegrid = displayio.TileGrid( + bitmap=self.spirit_board_odb, pixel_shader=self.spirit_board_odb.pixel_shader) + + self.append(self.spirit_board_tilegrid) + + # planchette image file + if display.width == 480 and display.height == 320: + self.planchette_odb = displayio.OnDiskBitmap("planchette_v1.bmp") + elif display.width == 320 and display.height == 240: + self.planchette_odb = displayio.OnDiskBitmap("planchette_v1_sm.bmp") + + self.planchette_odb.pixel_shader.make_transparent(0) + self.planchette_tilegrid = AnchoredTileGrid( + bitmap=self.planchette_odb, pixel_shader=self.planchette_odb.pixel_shader) + + # AnchoredTileGrid is used so that we can move the planchette + # relative to the cetner of the window. + self.planchette_tilegrid.anchor_point = (0.5, 0.5) + + # move the planchette to it's home to start + self.planchette_tilegrid.anchored_position = SpiritBoard.LOCATIONS['home'] + + # append the planchette to the self Group instance + self.append(self.planchette_tilegrid) + + # set the self Group instance to root_group, so it's shown on the display. + display.root_group = self + + def _convert_locations_for_small_screen(self): + _x_ratio = 320/480 + _y_ratio = 240/320 + # 46x + print(_x_ratio, _y_ratio) + for key, value in self.LOCATIONS.items(): + if isinstance(value, tuple): + _x, _y = value + self.LOCATIONS[key] = (int(_x * _x_ratio), int(_y * _y_ratio)) + elif isinstance(value, list): + for i in range(len(value)): + _x, _y = value[i] + self.LOCATIONS[key][i] = (int(_x * _x_ratio), int(_y * _y_ratio)) + + + @staticmethod + def dist(point_a, point_b): + """ + Calculate the distance between two points. + + :param tuple point_a: x,y pair of the first point + :param point_b: x,y pair of the second point + :return: the distance between the two points + """ + return math.sqrt((point_b[0] - point_a[0]) ** 2 + (point_b[1] - point_a[1]) ** 2) + + def slide_planchette(self, target_location, delay=0.1, step_size=4): + """ + Slide the planchette to the target location. + + delay and step_size parameters can be used to control the speed of the sliding. + + If the planchette is already at the target_location it will jump up slightly and + then return to the target location. This helps to clarify messages that contain + consecutive matching letters. + + :param tuple target_location: x,y pair of the target location + :param float delay: length of time to sleep inbetween each movement step + :param int step_size: how big of a step to take with each movement. + :return: None + """ + # disable auto_refresh during sliding, we refresh manually for each step + self._display.auto_refresh = False + + # current location + current_location = self.planchette_tilegrid.anchored_position + + # get the distance between the two + distance = SpiritBoard.dist(current_location, target_location) + + # if the planchette is already at the target location + if distance == 0: + # cannot slide to the location we're already at. + # slide up a tiny bit and then back to where we were. + self.slide_planchette((current_location[0], current_location[1] - 20), delay, step_size) + + # update the current location to where we moved to + current_location = self.planchette_tilegrid.anchored_position + + distance = SpiritBoard.dist(current_location, target_location) + + # variables used to calculate where the next point + # between where we are at and where we are going is. + distance_ratio = step_size / distance + one_minus_distance_ratio = 1 - distance_ratio + + # calculate the next point + next_point = ( + round(one_minus_distance_ratio * current_location[0] + + distance_ratio * target_location[0]), + round(one_minus_distance_ratio * current_location[1] + + distance_ratio * target_location[1]) + ) + # print(current_location) + # print(next_point) + + # update the anchored_position of the planchette to move it to + # the next point. + self.planchette_tilegrid.anchored_position = next_point + + # refresh the display + self._display.refresh() + + # wait for delay amount of time (seconds) + time.sleep(delay) + + # while we haven't made it to the target location + while 0 < distance_ratio < 1: + # update current location variable + current_location = self.planchette_tilegrid.anchored_position + + # calculate distance between new current location and target location + distance = SpiritBoard.dist(current_location, target_location) + + # if we have arrived at the target location + if distance == 0: + # break out of the function + break + + # distance ratio variables used to calculate next point + distance_ratio = step_size / distance + one_minus_distance_ratio = 1 - distance_ratio + + # calculate the next point + next_point = ( + round(one_minus_distance_ratio * current_location[0] + + distance_ratio * target_location[0]), + round(one_minus_distance_ratio * current_location[1] + + distance_ratio * target_location[1]) + ) + + # if we have not arrived at the target location yet + if 0 < distance_ratio < 1: + + # update the anchored position to move the planchette to the + # next point + self.planchette_tilegrid.anchored_position = next_point + + # refresh the display + self._display.refresh() + + # wait for delay amount of time (seconds) + time.sleep(delay) + + # update the anchored position to move the planchette to the + # target_location. This is needed in-case we undershot + # the target location due to a step size that does not + # divide into the total distance evenly. + self.planchette_tilegrid.anchored_position = target_location + + # refresh the display + self._display.refresh() + + # re-enable auto_refresh in case any other parts of the program + # want to update the display + self._display.auto_refresh = True + + def write_message(self, message, skip_spaces=True, step_size=6, delay=0.02): + """ + + :param string message: The message to output with the planchette + :param skip_spaces: Whether to skip space characters + :param step_size: How big of a step to take with each movement + :param delay: How many seconds to sleep between each movement step + :return: None + """ + # ignore empty messages + if message == "": + return + + # split the message on space to get a list of words + message_words = message.split(" ") + + # loop over the words in the message + for index, word in enumerate(message_words): + print(f"index: {index}, word: {word}") + # send it to lowercase to get rid of capital letters + word = word.lower() + + # if the current word is one of the full words on the board + if word in SpiritBoard.FULL_WORDS: + + # if the word on the board has multiple points + if isinstance(SpiritBoard.LOCATIONS[word], list): + # loop over the points for the word + for location in SpiritBoard.LOCATIONS[word]: + print(f"sliding to: {location}") + # slide the planchette to each point + self.slide_planchette(location, delay=delay, step_size=step_size) + + # pause at each point + time.sleep(0.25) + + # if the word has only a single point + elif isinstance(SpiritBoard.LOCATIONS[word], tuple): + # slide the planchette to the point + self.slide_planchette(SpiritBoard.LOCATIONS[word], + delay=delay, step_size=step_size) + + # pause at the point + time.sleep(0.5) + + else: # the current word is not one of the full words + # go one character at a time + + # loop over each character in the word + for character in word: + # if the character is in our locations mapping + if character in SpiritBoard.LOCATIONS: + # slide the planchette to the current characters location + self.slide_planchette(SpiritBoard.LOCATIONS[character], + delay=delay, step_size=step_size) + + # pause after we arrive + time.sleep(0.5) + else: + # character is not in our mapping + print(f"Skipping '{character}', it's not on the board.") + + # if we are not skipping spaces, and we are not done with the message + if not skip_spaces and index < len(message_words) - 1: + # handle the space + # slide the planchette to the empty space location. + self.slide_planchette(SpiritBoard.LOCATIONS[" "], + delay=delay, step_size=step_size) + + # pause after we arrive + time.sleep(0.5) + + # after we've shown the whole message + # slide the planchette back to it's home location + self.slide_planchette(SpiritBoard.LOCATIONS["home"], delay=delay, step_size=step_size) + + @staticmethod + def sync_with_io(io) -> list: + """ + Fetch messages from AdafruitIO and store them in the context variable. + + You must create the "SpiritBoard" feed object inside AdafruitIO for + this to succeed. + + Will raise an exception if connecting or fetching failed. + + :param io: The initialized adafruit IO object + + :return: List of messages + """ + if io is None: + raise RuntimeError("No connection to AdafruitIO") + + # fetch the latest data in the feed + incoming_message = io.receive_data("spiritboard") + + # if it's multiple messages seperated by commas + if "," in incoming_message["value"]: + # split on the commas to seperate the messages + # and put them in context + messages = incoming_message["value"].split(",") + + else: # it's only a single message + # set the single message into the context + messages = [incoming_message["value"]] + + # print if successful + if len(messages) > 0: + print("io fetch success") + + return messages + + + @staticmethod + def read_local_messages_file(shuffle=False) -> list: + """ + Read messages from the local spirit_messages.txt file on the CIRCUITPY drive. + Each message should be on its own line within that file. + + :param boolean shuffle: Whether to shuffle the messages. Default is False + which will keep them in the same order they appear in the file. + + :return: List of messages + """ + + # if the spirit_messages.txt file exists + if "spirit_messages.txt" in os.listdir("/"): + # open the file + with open("/spirit_messages.txt", "r", encoding="utf-8") as f: + # split on newline and set the messages found into the context + messages = f.read().split("\n") + + # if there are no messages + if len(messages) == 0: + # raise an error and tell the user to set some up + raise RuntimeError("Connection to adafruit.io failed, and there were " + "no messages in spirit_messages.txt. Enter your WIFI " + "credentials, aio username, and token in settings.toml, or add " + "messages to spirit_messages.txt.") + + # if there are messages and we need to shuffle them + if shuffle: + # temporary list to hold them + shuffled_list = [] + + # while there are still messages in the context messages list + while len(messages) > 0: + # pop a randomly chosen message from the context and + # put it into the temporary list + shuffled_list.append(messages.pop( + random.randint(0, len(messages) - 1))) + + # update the context list to the shuffled one + messages = shuffled_list + + return messages + + @staticmethod + def get_messages(io) -> list: + """ + Higher level get messages function. It will first attempt to + fetch the messages from Adafruit IO. If that doesn't work, + it will read them from the local spirit_messages.txt file. + + :param io: The initialized adafruit IO object + + :return: List of messages + """ + try: + return SpiritBoard.sync_with_io(io) + except (OSError, RuntimeError, AdafruitIO_RequestError) as e: + print(f"Caught Exception: {type(e)} - {e}.\nWill try again next time.\n" + "Falling back to spirit_messages.txt file.") + return SpiritBoard.read_local_messages_file() diff --git a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board_480x320.bmp b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board_480x320.bmp new file mode 100644 index 000000000..1848c9506 Binary files /dev/null and b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_board_480x320.bmp differ diff --git a/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_messages.txt b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_messages.txt new file mode 100644 index 000000000..7125df197 --- /dev/null +++ b/TFT_Spirit_Board/esp32s3_s2_tft_featherwing_480x320/spirit_messages.txt @@ -0,0 +1,4 @@ +hello world +spirits are near +i <3 circuitpython +goodbye \ No newline at end of file diff --git a/TFT_Spirit_Board/pyportal/code.py b/TFT_Spirit_Board/pyportal/code.py new file mode 100644 index 000000000..441a4733d --- /dev/null +++ b/TFT_Spirit_Board/pyportal/code.py @@ -0,0 +1,102 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SpiritBoard code.py +Standard PyPortal w/ 320x240 pixel display + +Receive and display messages from the spirits. +""" +# pylint: disable=import-error, invalid-name + +import os +import board +from digitalio import DigitalInOut +import adafruit_connection_manager +from adafruit_esp32spi import adafruit_esp32spi +import adafruit_touchscreen +import adafruit_requests +from adafruit_io.adafruit_io import IO_HTTP + +from spirit_board import SpiritBoard + +display = board.DISPLAY + +# Initialize the touch overlay +touchscreen = adafruit_touchscreen.Touchscreen( + board.TOUCH_XL, + board.TOUCH_XR, + board.TOUCH_YD, + board.TOUCH_YU, + calibration=((6584, 59861), (9505, 57492)), + size=(board.DISPLAY.width, board.DISPLAY.height), +) + +# Initialize the ES32SPI Coprocessor +esp32_cs = DigitalInOut(board.ESP_CS) +esp32_ready = DigitalInOut(board.ESP_BUSY) +esp32_reset = DigitalInOut(board.ESP_RESET) +spi = board.SPI() +esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) + +# connect to wifi network defined in settings.toml +print("Connecting to AP...") + +try: + esp.connect_AP(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD")) + + # Initialize a requests session + pool = adafruit_connection_manager.get_radio_socketpool(esp) + ssl_context = adafruit_connection_manager.get_radio_ssl_context(esp) + requests = adafruit_requests.Session(pool, ssl_context) + + # Set your Adafruit IO Username and Key in secrets.py + # (visit io.adafruit.com if you need to create an account, + # or if you need your Adafruit IO key.) + aio_username = os.getenv("AIO_USERNAME") + aio_key = os.getenv("AIO_KEY") + + # Initialize an Adafruit IO HTTP API object + io = IO_HTTP(aio_username, aio_key, requests) +except (RuntimeError, TypeError) as e: + print("could not connect to AP or AdafruitIO: ", e) + io = None + +# initialize the SpiritBoard class +spirit_board = SpiritBoard(display) + +# get messages from io or the local file +messages = spirit_board.get_messages(io) + +# The planchette is already at the home position. +# Slide it to home again to make it jump, in order +# indicate the message is ready to be received. +spirit_board.slide_planchette(SpiritBoard.LOCATIONS["home"], delay=0.02, step_size=6) + +# current message index +message_index = 0 +while True: + # read the touch screen + p = touchscreen.touch_point + + # if the display was touched + if p: + # write the message at the current index + spirit_board.write_message(messages[message_index], step_size=8) + + # if there are more messages in the list inside of context + if message_index < len(messages) - 1: + # increment the message index + message_index += 1 + + else: # there are no more messages in the list + # reset the index to 0 + message_index = 0 + print("fetching next") + + # fetch new messages + messages = spirit_board.get_messages(io) + + # make the planchette jump to indicate messages are ready to display + spirit_board.slide_planchette(SpiritBoard.LOCATIONS["home"], + delay=0.02, step_size=6) diff --git a/TFT_Spirit_Board/pyportal/planchette_v1_sm.bmp b/TFT_Spirit_Board/pyportal/planchette_v1_sm.bmp new file mode 100644 index 000000000..c9c5db964 Binary files /dev/null and b/TFT_Spirit_Board/pyportal/planchette_v1_sm.bmp differ diff --git a/TFT_Spirit_Board/pyportal/spirit_board.py b/TFT_Spirit_Board/pyportal/spirit_board.py new file mode 100644 index 000000000..9a889f608 --- /dev/null +++ b/TFT_Spirit_Board/pyportal/spirit_board.py @@ -0,0 +1,397 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SpiritBoard helper class +""" +import math +import os +import random +import time +import displayio + +# pylint: disable=import-error +from adafruit_anchored_tilegrid import AnchoredTileGrid +from adafruit_io.adafruit_io_errors import AdafruitIO_RequestError + + +class SpiritBoard(displayio.Group): + """ + DisplayIO Based SpiritBoard + + Holds and manages everything needed to draw the spirit board and planchette, as well + as move the planchette around to output messages from the spirits. + """ + # Mapping of letters and words on the board to their pixel coordinates. + # Points are centered on the target letter. + # Words can contain a list of points, the planchette will move between them. + LOCATIONS = {"a": (42, 145), "b": (63, 115), "c": (97, 97), "d": (133, 85), + "e": (172, 78), "f": (207, 75), "g": (245, 74), "h": (284, 75), + "i": (319, 80), "j": (345, 85), "k": (375, 95), "l": (410, 111), + "m": (435, 140), "n": (78, 190), "o": (96, 162), "p": (122, 145), + "q": (149, 132), "r": (179, 123), "s": (208, 118), "t": (235, 116), + "u": (267, 116), "v": (302, 119), "w": (334, 130), "x": (368, 147), + "y": (393, 168), "z": (405, 194), + " ": (151, 201), "<3": (247, 20), "?": (162, 18), "&": (339, 18), + "home": (234, 246), "yes": [(26, 20), (82, 20)], "no": [(418, 20), (450, 20)], + "hello": [(20, 300), (123, 300)], "goodbye": [(314, 300), (456, 300)]} + + # List of full words on the board (multi-character strings) + # used to know whether to parse the message + # one letter at a time, or with a full word. + FULL_WORDS = ["yes", "no", "hello", "goodbye", "home", "<3"] + + def __init__(self, display): + """ + Create a SpiritBoard instance and put it in the displays root_group to make it visible. + + :param displayio.Display display: Display object to show the spirit board on. + """ + self._display = display + super().__init__() + + # board image file + if display.width == 480 and display.height == 320: + self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_480x320.bmp") + elif display.width == 320 and display.height == 240: + self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_320x240.bmp") + self._convert_locations_for_small_screen() + self.spirit_board_tilegrid = displayio.TileGrid( + bitmap=self.spirit_board_odb, pixel_shader=self.spirit_board_odb.pixel_shader) + + self.append(self.spirit_board_tilegrid) + + # planchette image file + if display.width == 480 and display.height == 320: + self.planchette_odb = displayio.OnDiskBitmap("planchette_v1.bmp") + elif display.width == 320 and display.height == 240: + self.planchette_odb = displayio.OnDiskBitmap("planchette_v1_sm.bmp") + + self.planchette_odb.pixel_shader.make_transparent(0) + self.planchette_tilegrid = AnchoredTileGrid( + bitmap=self.planchette_odb, pixel_shader=self.planchette_odb.pixel_shader) + + # AnchoredTileGrid is used so that we can move the planchette + # relative to the cetner of the window. + self.planchette_tilegrid.anchor_point = (0.5, 0.5) + + # move the planchette to it's home to start + self.planchette_tilegrid.anchored_position = SpiritBoard.LOCATIONS['home'] + + # append the planchette to the self Group instance + self.append(self.planchette_tilegrid) + + # set the self Group instance to root_group, so it's shown on the display. + display.root_group = self + + def _convert_locations_for_small_screen(self): + _x_ratio = 320/480 + _y_ratio = 240/320 + # 46x + print(_x_ratio, _y_ratio) + for key, value in self.LOCATIONS.items(): + if isinstance(value, tuple): + _x, _y = value + self.LOCATIONS[key] = (int(_x * _x_ratio), int(_y * _y_ratio)) + elif isinstance(value, list): + for i in range(len(value)): + _x, _y = value[i] + self.LOCATIONS[key][i] = (int(_x * _x_ratio), int(_y * _y_ratio)) + + + @staticmethod + def dist(point_a, point_b): + """ + Calculate the distance between two points. + + :param tuple point_a: x,y pair of the first point + :param point_b: x,y pair of the second point + :return: the distance between the two points + """ + return math.sqrt((point_b[0] - point_a[0]) ** 2 + (point_b[1] - point_a[1]) ** 2) + + def slide_planchette(self, target_location, delay=0.1, step_size=4): + """ + Slide the planchette to the target location. + + delay and step_size parameters can be used to control the speed of the sliding. + + If the planchette is already at the target_location it will jump up slightly and + then return to the target location. This helps to clarify messages that contain + consecutive matching letters. + + :param tuple target_location: x,y pair of the target location + :param float delay: length of time to sleep inbetween each movement step + :param int step_size: how big of a step to take with each movement. + :return: None + """ + # disable auto_refresh during sliding, we refresh manually for each step + self._display.auto_refresh = False + + # current location + current_location = self.planchette_tilegrid.anchored_position + + # get the distance between the two + distance = SpiritBoard.dist(current_location, target_location) + + # if the planchette is already at the target location + if distance == 0: + # cannot slide to the location we're already at. + # slide up a tiny bit and then back to where we were. + self.slide_planchette((current_location[0], current_location[1] - 20), delay, step_size) + + # update the current location to where we moved to + current_location = self.planchette_tilegrid.anchored_position + + distance = SpiritBoard.dist(current_location, target_location) + + # variables used to calculate where the next point + # between where we are at and where we are going is. + distance_ratio = step_size / distance + one_minus_distance_ratio = 1 - distance_ratio + + # calculate the next point + next_point = ( + round(one_minus_distance_ratio * current_location[0] + + distance_ratio * target_location[0]), + round(one_minus_distance_ratio * current_location[1] + + distance_ratio * target_location[1]) + ) + # print(current_location) + # print(next_point) + + # update the anchored_position of the planchette to move it to + # the next point. + self.planchette_tilegrid.anchored_position = next_point + + # refresh the display + self._display.refresh() + + # wait for delay amount of time (seconds) + time.sleep(delay) + + # while we haven't made it to the target location + while 0 < distance_ratio < 1: + # update current location variable + current_location = self.planchette_tilegrid.anchored_position + + # calculate distance between new current location and target location + distance = SpiritBoard.dist(current_location, target_location) + + # if we have arrived at the target location + if distance == 0: + # break out of the function + break + + # distance ratio variables used to calculate next point + distance_ratio = step_size / distance + one_minus_distance_ratio = 1 - distance_ratio + + # calculate the next point + next_point = ( + round(one_minus_distance_ratio * current_location[0] + + distance_ratio * target_location[0]), + round(one_minus_distance_ratio * current_location[1] + + distance_ratio * target_location[1]) + ) + + # if we have not arrived at the target location yet + if 0 < distance_ratio < 1: + + # update the anchored position to move the planchette to the + # next point + self.planchette_tilegrid.anchored_position = next_point + + # refresh the display + self._display.refresh() + + # wait for delay amount of time (seconds) + time.sleep(delay) + + # update the anchored position to move the planchette to the + # target_location. This is needed in-case we undershot + # the target location due to a step size that does not + # divide into the total distance evenly. + self.planchette_tilegrid.anchored_position = target_location + + # refresh the display + self._display.refresh() + + # re-enable auto_refresh in case any other parts of the program + # want to update the display + self._display.auto_refresh = True + + def write_message(self, message, skip_spaces=True, step_size=6, delay=0.02): + """ + + :param string message: The message to output with the planchette + :param skip_spaces: Whether to skip space characters + :param step_size: How big of a step to take with each movement + :param delay: How many seconds to sleep between each movement step + :return: None + """ + # ignore empty messages + if message == "": + return + + # split the message on space to get a list of words + message_words = message.split(" ") + + # loop over the words in the message + for index, word in enumerate(message_words): + print(f"index: {index}, word: {word}") + # send it to lowercase to get rid of capital letters + word = word.lower() + + # if the current word is one of the full words on the board + if word in SpiritBoard.FULL_WORDS: + + # if the word on the board has multiple points + if isinstance(SpiritBoard.LOCATIONS[word], list): + # loop over the points for the word + for location in SpiritBoard.LOCATIONS[word]: + print(f"sliding to: {location}") + # slide the planchette to each point + self.slide_planchette(location, delay=delay, step_size=step_size) + + # pause at each point + time.sleep(0.25) + + # if the word has only a single point + elif isinstance(SpiritBoard.LOCATIONS[word], tuple): + # slide the planchette to the point + self.slide_planchette(SpiritBoard.LOCATIONS[word], + delay=delay, step_size=step_size) + + # pause at the point + time.sleep(0.5) + + else: # the current word is not one of the full words + # go one character at a time + + # loop over each character in the word + for character in word: + # if the character is in our locations mapping + if character in SpiritBoard.LOCATIONS: + # slide the planchette to the current characters location + self.slide_planchette(SpiritBoard.LOCATIONS[character], + delay=delay, step_size=step_size) + + # pause after we arrive + time.sleep(0.5) + else: + # character is not in our mapping + print(f"Skipping '{character}', it's not on the board.") + + # if we are not skipping spaces, and we are not done with the message + if not skip_spaces and index < len(message_words) - 1: + # handle the space + # slide the planchette to the empty space location. + self.slide_planchette(SpiritBoard.LOCATIONS[" "], + delay=delay, step_size=step_size) + + # pause after we arrive + time.sleep(0.5) + + # after we've shown the whole message + # slide the planchette back to it's home location + self.slide_planchette(SpiritBoard.LOCATIONS["home"], delay=delay, step_size=step_size) + + @staticmethod + def sync_with_io(io) -> list: + """ + Fetch messages from AdafruitIO and store them in the context variable. + + You must create the "SpiritBoard" feed object inside AdafruitIO for + this to succeed. + + Will raise an exception if connecting or fetching failed. + + :param io: The initialized adafruit IO object + + :return: List of messages + """ + if io is None: + raise RuntimeError("No connection to AdafruitIO") + + # fetch the latest data in the feed + incoming_message = io.receive_data("spiritboard") + + # if it's multiple messages seperated by commas + if "," in incoming_message["value"]: + # split on the commas to seperate the messages + # and put them in context + messages = incoming_message["value"].split(",") + + else: # it's only a single message + # set the single message into the context + messages = [incoming_message["value"]] + + # print if successful + if len(messages) > 0: + print("io fetch success") + + return messages + + + @staticmethod + def read_local_messages_file(shuffle=False) -> list: + """ + Read messages from the local spirit_messages.txt file on the CIRCUITPY drive. + Each message should be on its own line within that file. + + :param boolean shuffle: Whether to shuffle the messages. Default is False + which will keep them in the same order they appear in the file. + + :return: List of messages + """ + + # if the spirit_messages.txt file exists + if "spirit_messages.txt" in os.listdir("/"): + # open the file + with open("/spirit_messages.txt", "r", encoding="utf-8") as f: + # split on newline and set the messages found into the context + messages = f.read().split("\n") + + # if there are no messages + if len(messages) == 0: + # raise an error and tell the user to set some up + raise RuntimeError("Connection to adafruit.io failed, and there were " + "no messages in spirit_messages.txt. Enter your WIFI " + "credentials, aio username, and token in settings.toml, or add " + "messages to spirit_messages.txt.") + + # if there are messages and we need to shuffle them + if shuffle: + # temporary list to hold them + shuffled_list = [] + + # while there are still messages in the context messages list + while len(messages) > 0: + # pop a randomly chosen message from the context and + # put it into the temporary list + shuffled_list.append(messages.pop( + random.randint(0, len(messages) - 1))) + + # update the context list to the shuffled one + messages = shuffled_list + + return messages + + @staticmethod + def get_messages(io) -> list: + """ + Higher level get messages function. It will first attempt to + fetch the messages from Adafruit IO. If that doesn't work, + it will read them from the local spirit_messages.txt file. + + :param io: The initialized adafruit IO object + + :return: List of messages + """ + try: + return SpiritBoard.sync_with_io(io) + except (OSError, RuntimeError, AdafruitIO_RequestError) as e: + print(f"Caught Exception: {type(e)} - {e}.\nWill try again next time.\n" + "Falling back to spirit_messages.txt file.") + return SpiritBoard.read_local_messages_file() diff --git a/TFT_Spirit_Board/pyportal/spirit_board_320x240.bmp b/TFT_Spirit_Board/pyportal/spirit_board_320x240.bmp new file mode 100644 index 000000000..37f8d3b4d Binary files /dev/null and b/TFT_Spirit_Board/pyportal/spirit_board_320x240.bmp differ diff --git a/TFT_Spirit_Board/pyportal/spirit_messages.txt b/TFT_Spirit_Board/pyportal/spirit_messages.txt new file mode 100644 index 000000000..7125df197 --- /dev/null +++ b/TFT_Spirit_Board/pyportal/spirit_messages.txt @@ -0,0 +1,4 @@ +hello world +spirits are near +i <3 circuitpython +goodbye \ No newline at end of file diff --git a/TFT_Spirit_Board/pyportal_titano/code.py b/TFT_Spirit_Board/pyportal_titano/code.py new file mode 100644 index 000000000..68b77d401 --- /dev/null +++ b/TFT_Spirit_Board/pyportal_titano/code.py @@ -0,0 +1,102 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SpiritBoard code.py +PyPortal w/ 480x320 pixel display + +Receive and display messages from the spirits. +""" +# pylint: disable=import-error, invalid-name + +import os +import board +from digitalio import DigitalInOut +import adafruit_connection_manager +from adafruit_esp32spi import adafruit_esp32spi +import adafruit_touchscreen +import adafruit_requests +from adafruit_io.adafruit_io import IO_HTTP + +from spirit_board import SpiritBoard + +display = board.DISPLAY + +# Initialize the touch overlay +touchscreen = adafruit_touchscreen.Touchscreen( + board.TOUCH_XL, + board.TOUCH_XR, + board.TOUCH_YD, + board.TOUCH_YU, + calibration=((6584, 59861), (9505, 57492)), + size=(board.DISPLAY.width, board.DISPLAY.height), +) + +# Initialize the ES32SPI Coprocessor +esp32_cs = DigitalInOut(board.ESP_CS) +esp32_ready = DigitalInOut(board.ESP_BUSY) +esp32_reset = DigitalInOut(board.ESP_RESET) +spi = board.SPI() +esp = adafruit_esp32spi.ESP_SPIcontrol(spi, esp32_cs, esp32_ready, esp32_reset) + +# connect to wifi network defined in settings.toml +print("Connecting to AP...") + +try: + esp.connect_AP(os.getenv("CIRCUITPY_WIFI_SSID"), os.getenv("CIRCUITPY_WIFI_PASSWORD")) + + # Initialize a requests session + pool = adafruit_connection_manager.get_radio_socketpool(esp) + ssl_context = adafruit_connection_manager.get_radio_ssl_context(esp) + requests = adafruit_requests.Session(pool, ssl_context) + + # Set your Adafruit IO Username and Key in secrets.py + # (visit io.adafruit.com if you need to create an account, + # or if you need your Adafruit IO key.) + aio_username = os.getenv("AIO_USERNAME") + aio_key = os.getenv("AIO_KEY") + + # Initialize an Adafruit IO HTTP API object + io = IO_HTTP(aio_username, aio_key, requests) +except (RuntimeError, TypeError) as e: + print("could not connect to AP or AdafruitIO: ", e) + io = None + +# initialize the SpiritBoard class +spirit_board = SpiritBoard(display) + +# get messages from io or the local file +messages = spirit_board.get_messages(io) + +# The planchette is already at the home position. +# Slide it to home again to make it jump, in order +# indicate the message is ready to be received. +spirit_board.slide_planchette(SpiritBoard.LOCATIONS["home"], delay=0.02, step_size=6) + +# current message index +message_index = 0 +while True: + # read the touch screen + p = touchscreen.touch_point + + # if the display was touched + if p: + # write the message at the current index + spirit_board.write_message(messages[message_index], step_size=8) + + # if there are more messages in the list inside of context + if message_index < len(messages) - 1: + # increment the message index + message_index += 1 + + else: # there are no more messages in the list + # reset the index to 0 + message_index = 0 + print("fetching next") + + # fetch new messages + messages = spirit_board.get_messages(io) + + # make the planchette jump to indicate messages are ready to display + spirit_board.slide_planchette(SpiritBoard.LOCATIONS["home"], + delay=0.02, step_size=6) diff --git a/TFT_Spirit_Board/pyportal_titano/planchette_v1.bmp b/TFT_Spirit_Board/pyportal_titano/planchette_v1.bmp new file mode 100644 index 000000000..b36ff9c82 Binary files /dev/null and b/TFT_Spirit_Board/pyportal_titano/planchette_v1.bmp differ diff --git a/TFT_Spirit_Board/pyportal_titano/spirit_board.py b/TFT_Spirit_Board/pyportal_titano/spirit_board.py new file mode 100644 index 000000000..9a889f608 --- /dev/null +++ b/TFT_Spirit_Board/pyportal_titano/spirit_board.py @@ -0,0 +1,397 @@ +# SPDX-FileCopyrightText: 2024 Tim Cocks +# +# SPDX-License-Identifier: MIT +""" +SpiritBoard helper class +""" +import math +import os +import random +import time +import displayio + +# pylint: disable=import-error +from adafruit_anchored_tilegrid import AnchoredTileGrid +from adafruit_io.adafruit_io_errors import AdafruitIO_RequestError + + +class SpiritBoard(displayio.Group): + """ + DisplayIO Based SpiritBoard + + Holds and manages everything needed to draw the spirit board and planchette, as well + as move the planchette around to output messages from the spirits. + """ + # Mapping of letters and words on the board to their pixel coordinates. + # Points are centered on the target letter. + # Words can contain a list of points, the planchette will move between them. + LOCATIONS = {"a": (42, 145), "b": (63, 115), "c": (97, 97), "d": (133, 85), + "e": (172, 78), "f": (207, 75), "g": (245, 74), "h": (284, 75), + "i": (319, 80), "j": (345, 85), "k": (375, 95), "l": (410, 111), + "m": (435, 140), "n": (78, 190), "o": (96, 162), "p": (122, 145), + "q": (149, 132), "r": (179, 123), "s": (208, 118), "t": (235, 116), + "u": (267, 116), "v": (302, 119), "w": (334, 130), "x": (368, 147), + "y": (393, 168), "z": (405, 194), + " ": (151, 201), "<3": (247, 20), "?": (162, 18), "&": (339, 18), + "home": (234, 246), "yes": [(26, 20), (82, 20)], "no": [(418, 20), (450, 20)], + "hello": [(20, 300), (123, 300)], "goodbye": [(314, 300), (456, 300)]} + + # List of full words on the board (multi-character strings) + # used to know whether to parse the message + # one letter at a time, or with a full word. + FULL_WORDS = ["yes", "no", "hello", "goodbye", "home", "<3"] + + def __init__(self, display): + """ + Create a SpiritBoard instance and put it in the displays root_group to make it visible. + + :param displayio.Display display: Display object to show the spirit board on. + """ + self._display = display + super().__init__() + + # board image file + if display.width == 480 and display.height == 320: + self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_480x320.bmp") + elif display.width == 320 and display.height == 240: + self.spirit_board_odb = displayio.OnDiskBitmap("spirit_board_320x240.bmp") + self._convert_locations_for_small_screen() + self.spirit_board_tilegrid = displayio.TileGrid( + bitmap=self.spirit_board_odb, pixel_shader=self.spirit_board_odb.pixel_shader) + + self.append(self.spirit_board_tilegrid) + + # planchette image file + if display.width == 480 and display.height == 320: + self.planchette_odb = displayio.OnDiskBitmap("planchette_v1.bmp") + elif display.width == 320 and display.height == 240: + self.planchette_odb = displayio.OnDiskBitmap("planchette_v1_sm.bmp") + + self.planchette_odb.pixel_shader.make_transparent(0) + self.planchette_tilegrid = AnchoredTileGrid( + bitmap=self.planchette_odb, pixel_shader=self.planchette_odb.pixel_shader) + + # AnchoredTileGrid is used so that we can move the planchette + # relative to the cetner of the window. + self.planchette_tilegrid.anchor_point = (0.5, 0.5) + + # move the planchette to it's home to start + self.planchette_tilegrid.anchored_position = SpiritBoard.LOCATIONS['home'] + + # append the planchette to the self Group instance + self.append(self.planchette_tilegrid) + + # set the self Group instance to root_group, so it's shown on the display. + display.root_group = self + + def _convert_locations_for_small_screen(self): + _x_ratio = 320/480 + _y_ratio = 240/320 + # 46x + print(_x_ratio, _y_ratio) + for key, value in self.LOCATIONS.items(): + if isinstance(value, tuple): + _x, _y = value + self.LOCATIONS[key] = (int(_x * _x_ratio), int(_y * _y_ratio)) + elif isinstance(value, list): + for i in range(len(value)): + _x, _y = value[i] + self.LOCATIONS[key][i] = (int(_x * _x_ratio), int(_y * _y_ratio)) + + + @staticmethod + def dist(point_a, point_b): + """ + Calculate the distance between two points. + + :param tuple point_a: x,y pair of the first point + :param point_b: x,y pair of the second point + :return: the distance between the two points + """ + return math.sqrt((point_b[0] - point_a[0]) ** 2 + (point_b[1] - point_a[1]) ** 2) + + def slide_planchette(self, target_location, delay=0.1, step_size=4): + """ + Slide the planchette to the target location. + + delay and step_size parameters can be used to control the speed of the sliding. + + If the planchette is already at the target_location it will jump up slightly and + then return to the target location. This helps to clarify messages that contain + consecutive matching letters. + + :param tuple target_location: x,y pair of the target location + :param float delay: length of time to sleep inbetween each movement step + :param int step_size: how big of a step to take with each movement. + :return: None + """ + # disable auto_refresh during sliding, we refresh manually for each step + self._display.auto_refresh = False + + # current location + current_location = self.planchette_tilegrid.anchored_position + + # get the distance between the two + distance = SpiritBoard.dist(current_location, target_location) + + # if the planchette is already at the target location + if distance == 0: + # cannot slide to the location we're already at. + # slide up a tiny bit and then back to where we were. + self.slide_planchette((current_location[0], current_location[1] - 20), delay, step_size) + + # update the current location to where we moved to + current_location = self.planchette_tilegrid.anchored_position + + distance = SpiritBoard.dist(current_location, target_location) + + # variables used to calculate where the next point + # between where we are at and where we are going is. + distance_ratio = step_size / distance + one_minus_distance_ratio = 1 - distance_ratio + + # calculate the next point + next_point = ( + round(one_minus_distance_ratio * current_location[0] + + distance_ratio * target_location[0]), + round(one_minus_distance_ratio * current_location[1] + + distance_ratio * target_location[1]) + ) + # print(current_location) + # print(next_point) + + # update the anchored_position of the planchette to move it to + # the next point. + self.planchette_tilegrid.anchored_position = next_point + + # refresh the display + self._display.refresh() + + # wait for delay amount of time (seconds) + time.sleep(delay) + + # while we haven't made it to the target location + while 0 < distance_ratio < 1: + # update current location variable + current_location = self.planchette_tilegrid.anchored_position + + # calculate distance between new current location and target location + distance = SpiritBoard.dist(current_location, target_location) + + # if we have arrived at the target location + if distance == 0: + # break out of the function + break + + # distance ratio variables used to calculate next point + distance_ratio = step_size / distance + one_minus_distance_ratio = 1 - distance_ratio + + # calculate the next point + next_point = ( + round(one_minus_distance_ratio * current_location[0] + + distance_ratio * target_location[0]), + round(one_minus_distance_ratio * current_location[1] + + distance_ratio * target_location[1]) + ) + + # if we have not arrived at the target location yet + if 0 < distance_ratio < 1: + + # update the anchored position to move the planchette to the + # next point + self.planchette_tilegrid.anchored_position = next_point + + # refresh the display + self._display.refresh() + + # wait for delay amount of time (seconds) + time.sleep(delay) + + # update the anchored position to move the planchette to the + # target_location. This is needed in-case we undershot + # the target location due to a step size that does not + # divide into the total distance evenly. + self.planchette_tilegrid.anchored_position = target_location + + # refresh the display + self._display.refresh() + + # re-enable auto_refresh in case any other parts of the program + # want to update the display + self._display.auto_refresh = True + + def write_message(self, message, skip_spaces=True, step_size=6, delay=0.02): + """ + + :param string message: The message to output with the planchette + :param skip_spaces: Whether to skip space characters + :param step_size: How big of a step to take with each movement + :param delay: How many seconds to sleep between each movement step + :return: None + """ + # ignore empty messages + if message == "": + return + + # split the message on space to get a list of words + message_words = message.split(" ") + + # loop over the words in the message + for index, word in enumerate(message_words): + print(f"index: {index}, word: {word}") + # send it to lowercase to get rid of capital letters + word = word.lower() + + # if the current word is one of the full words on the board + if word in SpiritBoard.FULL_WORDS: + + # if the word on the board has multiple points + if isinstance(SpiritBoard.LOCATIONS[word], list): + # loop over the points for the word + for location in SpiritBoard.LOCATIONS[word]: + print(f"sliding to: {location}") + # slide the planchette to each point + self.slide_planchette(location, delay=delay, step_size=step_size) + + # pause at each point + time.sleep(0.25) + + # if the word has only a single point + elif isinstance(SpiritBoard.LOCATIONS[word], tuple): + # slide the planchette to the point + self.slide_planchette(SpiritBoard.LOCATIONS[word], + delay=delay, step_size=step_size) + + # pause at the point + time.sleep(0.5) + + else: # the current word is not one of the full words + # go one character at a time + + # loop over each character in the word + for character in word: + # if the character is in our locations mapping + if character in SpiritBoard.LOCATIONS: + # slide the planchette to the current characters location + self.slide_planchette(SpiritBoard.LOCATIONS[character], + delay=delay, step_size=step_size) + + # pause after we arrive + time.sleep(0.5) + else: + # character is not in our mapping + print(f"Skipping '{character}', it's not on the board.") + + # if we are not skipping spaces, and we are not done with the message + if not skip_spaces and index < len(message_words) - 1: + # handle the space + # slide the planchette to the empty space location. + self.slide_planchette(SpiritBoard.LOCATIONS[" "], + delay=delay, step_size=step_size) + + # pause after we arrive + time.sleep(0.5) + + # after we've shown the whole message + # slide the planchette back to it's home location + self.slide_planchette(SpiritBoard.LOCATIONS["home"], delay=delay, step_size=step_size) + + @staticmethod + def sync_with_io(io) -> list: + """ + Fetch messages from AdafruitIO and store them in the context variable. + + You must create the "SpiritBoard" feed object inside AdafruitIO for + this to succeed. + + Will raise an exception if connecting or fetching failed. + + :param io: The initialized adafruit IO object + + :return: List of messages + """ + if io is None: + raise RuntimeError("No connection to AdafruitIO") + + # fetch the latest data in the feed + incoming_message = io.receive_data("spiritboard") + + # if it's multiple messages seperated by commas + if "," in incoming_message["value"]: + # split on the commas to seperate the messages + # and put them in context + messages = incoming_message["value"].split(",") + + else: # it's only a single message + # set the single message into the context + messages = [incoming_message["value"]] + + # print if successful + if len(messages) > 0: + print("io fetch success") + + return messages + + + @staticmethod + def read_local_messages_file(shuffle=False) -> list: + """ + Read messages from the local spirit_messages.txt file on the CIRCUITPY drive. + Each message should be on its own line within that file. + + :param boolean shuffle: Whether to shuffle the messages. Default is False + which will keep them in the same order they appear in the file. + + :return: List of messages + """ + + # if the spirit_messages.txt file exists + if "spirit_messages.txt" in os.listdir("/"): + # open the file + with open("/spirit_messages.txt", "r", encoding="utf-8") as f: + # split on newline and set the messages found into the context + messages = f.read().split("\n") + + # if there are no messages + if len(messages) == 0: + # raise an error and tell the user to set some up + raise RuntimeError("Connection to adafruit.io failed, and there were " + "no messages in spirit_messages.txt. Enter your WIFI " + "credentials, aio username, and token in settings.toml, or add " + "messages to spirit_messages.txt.") + + # if there are messages and we need to shuffle them + if shuffle: + # temporary list to hold them + shuffled_list = [] + + # while there are still messages in the context messages list + while len(messages) > 0: + # pop a randomly chosen message from the context and + # put it into the temporary list + shuffled_list.append(messages.pop( + random.randint(0, len(messages) - 1))) + + # update the context list to the shuffled one + messages = shuffled_list + + return messages + + @staticmethod + def get_messages(io) -> list: + """ + Higher level get messages function. It will first attempt to + fetch the messages from Adafruit IO. If that doesn't work, + it will read them from the local spirit_messages.txt file. + + :param io: The initialized adafruit IO object + + :return: List of messages + """ + try: + return SpiritBoard.sync_with_io(io) + except (OSError, RuntimeError, AdafruitIO_RequestError) as e: + print(f"Caught Exception: {type(e)} - {e}.\nWill try again next time.\n" + "Falling back to spirit_messages.txt file.") + return SpiritBoard.read_local_messages_file() diff --git a/TFT_Spirit_Board/pyportal_titano/spirit_board_480x320.bmp b/TFT_Spirit_Board/pyportal_titano/spirit_board_480x320.bmp new file mode 100644 index 000000000..1848c9506 Binary files /dev/null and b/TFT_Spirit_Board/pyportal_titano/spirit_board_480x320.bmp differ diff --git a/TFT_Spirit_Board/pyportal_titano/spirit_messages.txt b/TFT_Spirit_Board/pyportal_titano/spirit_messages.txt new file mode 100644 index 000000000..7125df197 --- /dev/null +++ b/TFT_Spirit_Board/pyportal_titano/spirit_messages.txt @@ -0,0 +1,4 @@ +hello world +spirits are near +i <3 circuitpython +goodbye \ No newline at end of file diff --git a/TMC2209_Examples/Arduino_TMC2209/Arduino_TMC2209.ino b/TMC2209_Examples/Arduino_TMC2209/Arduino_TMC2209.ino new file mode 100644 index 000000000..946bbc06d --- /dev/null +++ b/TMC2209_Examples/Arduino_TMC2209/Arduino_TMC2209.ino @@ -0,0 +1,31 @@ +// SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +const int DIR = 5; +const int STEP = 6; +const int microMode = 8; // microstep mode, default is 1/8 so 8; ex: 1/16 would be 16 +// full rotation * microstep divider +const int steps = 200 * microMode; + +void setup() +{ + // setup step and dir pins as outputs + pinMode(STEP, OUTPUT); + pinMode(DIR, OUTPUT); +} + +void loop() +{ + // change direction every loop + digitalWrite(DIR, !digitalRead(DIR)); + // toggle STEP to move + for(int x = 0; x < steps; x++) + { + digitalWrite(STEP, HIGH); + delay(2); + digitalWrite(STEP, LOW); + delay(2); + } + delay(1000); // 1 second delay +} diff --git a/TMC2209_Examples/CircuitPython_TMC2209/code.py b/TMC2209_Examples/CircuitPython_TMC2209/code.py new file mode 100644 index 000000000..30c78246c --- /dev/null +++ b/TMC2209_Examples/CircuitPython_TMC2209/code.py @@ -0,0 +1,32 @@ +# SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +from digitalio import DigitalInOut, Direction + +# direction and step pins as outputs +DIR = DigitalInOut(board.D5) +DIR.direction = Direction.OUTPUT +STEP = DigitalInOut(board.D6) +STEP.direction = Direction.OUTPUT + +# microstep mode, default is 1/8 so 8 +# another ex: 1/16 microstep would be 16 +microMode = 8 +# full rotation multiplied by the microstep divider +steps = 200 * microMode + +while True: + # change direction every loop + DIR.value = not DIR.value + # toggle STEP pin to move the motor + for i in range(steps): + STEP.value = True + time.sleep(0.001) + STEP.value = False + time.sleep(0.001) + print("rotated! now reverse") + # 1 second delay before starting again + time.sleep(1) diff --git a/TMC2209_Motorized_Turntable/Arial-14.bdf b/TMC2209_Motorized_Turntable/Arial-14.bdf new file mode 100644 index 000000000..a92736e1a --- /dev/null +++ b/TMC2209_Motorized_Turntable/Arial-14.bdf @@ -0,0 +1,27566 @@ +STARTFONT 2.1 +COMMENT +COMMENT Converted from OpenType font "arial.ttf" by "otf2bdf 3.0". +COMMENT +FONT -FreeType-Arial-Medium-R-Normal--19-140-100-100-P-94-ISO10646-1 +SIZE 14 100 100 +FONTBOUNDINGBOX 34 26 -13 -6 +STARTPROPERTIES 19 +FOUNDRY "FreeType" +FAMILY_NAME "Arial" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 19 +POINT_SIZE 140 +RESOLUTION_X 100 +RESOLUTION_Y 100 +SPACING "P" +AVERAGE_WIDTH 94 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONT_ASCENT 17 +FONT_DESCENT 4 +COPYRIGHT "Typeface © The Monotype Corporation plc. Data © The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved" +_OTF_FONTFILE "arial.ttf" +_OTF_PSNAME "ArialMT" +ENDPROPERTIES +CHARS 1419 +STARTCHAR 0020 +ENCODING 32 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0021 +ENCODING 33 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +00 +C0 +C0 +ENDCHAR +STARTCHAR 0022 +ENCODING 34 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 5 1 9 +BITMAP +D8 +D8 +D8 +D8 +90 +ENDCHAR +STARTCHAR 0023 +ENCODING 35 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0880 +0880 +1880 +FFC0 +FFC0 +1100 +3100 +3100 +FFC0 +FFC0 +2200 +6200 +6200 +4600 +ENDCHAR +STARTCHAR 0024 +ENCODING 36 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -2 +BITMAP +0800 +3E00 +7F00 +CB00 +C800 +C800 +7800 +3E00 +0F00 +0900 +0980 +C980 +CB00 +7F00 +3E00 +0800 +0800 +ENDCHAR +STARTCHAR 0025 +ENCODING 37 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +7830 +4C20 +CC40 +CC40 +CC80 +4880 +7900 +0338 +0264 +0646 +0446 +0C46 +0864 +1838 +ENDCHAR +STARTCHAR 0026 +ENCODING 38 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1E00 +3F00 +3300 +2300 +3300 +1E00 +3C00 +7C00 +C6C0 +C3C0 +C180 +E3C0 +7FE0 +3C60 +ENDCHAR +STARTCHAR 0027 +ENCODING 39 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +C0 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR 0028 +ENCODING 40 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 18 1 -4 +BITMAP +10 +30 +20 +60 +60 +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +60 +60 +20 +30 +10 +ENDCHAR +STARTCHAR 0029 +ENCODING 41 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 18 1 -4 +BITMAP +C0 +40 +60 +20 +30 +10 +10 +18 +18 +18 +18 +10 +10 +30 +20 +60 +40 +C0 +ENDCHAR +STARTCHAR 002A +ENCODING 42 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 6 1 8 +BITMAP +20 +20 +FC +30 +50 +48 +ENDCHAR +STARTCHAR 002B +ENCODING 43 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 1 +BITMAP +0800 +0800 +0800 +0800 +FF80 +FF80 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 002C +ENCODING 44 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 5 2 -3 +BITMAP +C0 +C0 +40 +80 +80 +ENDCHAR +STARTCHAR 002D +ENCODING 45 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 2 1 4 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR 002E +ENCODING 46 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 2 2 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 002F +ENCODING 47 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +08 +08 +18 +10 +10 +30 +20 +20 +20 +60 +40 +40 +C0 +80 +ENDCHAR +STARTCHAR 0030 +ENCODING 48 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +6300 +C300 +C100 +C180 +C180 +C180 +C180 +C100 +C300 +E300 +7E00 +3C00 +ENDCHAR +STARTCHAR 0031 +ENCODING 49 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 5 14 2 0 +BITMAP +08 +18 +38 +F8 +98 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 0032 +ENCODING 50 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3E00 +7F00 +C300 +C180 +0180 +0300 +0300 +0600 +1C00 +3800 +6000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 0033 +ENCODING 51 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +C300 +C300 +0300 +1E00 +1F00 +0300 +0180 +0180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0034 +ENCODING 52 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0300 +0700 +0700 +0F00 +1B00 +1300 +3300 +6300 +4300 +FFC0 +FFC0 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 0035 +ENCODING 53 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +7F00 +7F00 +6000 +4000 +4000 +DE00 +FF00 +C300 +0180 +0180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0036 +ENCODING 54 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3E00 +7F00 +6300 +C100 +C000 +9E00 +BF00 +E300 +C180 +C180 +C180 +E300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0037 +ENCODING 55 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +FF80 +FF80 +0300 +0600 +0600 +0C00 +0C00 +1800 +1800 +1000 +3000 +3000 +3000 +3000 +ENDCHAR +STARTCHAR 0038 +ENCODING 56 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +6300 +C300 +C300 +6300 +3E00 +7E00 +C300 +C180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 0039 +ENCODING 57 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +E300 +C100 +C180 +C180 +C380 +7F80 +3D80 +0180 +C300 +C300 +7E00 +3C00 +ENDCHAR +STARTCHAR 003A +ENCODING 58 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 10 2 0 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR 003B +ENCODING 59 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 13 2 -3 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +40 +80 +80 +ENDCHAR +STARTCHAR 003C +ENCODING 60 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 2 +BITMAP +0080 +0380 +1F00 +7800 +C000 +7800 +1F00 +0380 +0080 +ENDCHAR +STARTCHAR 003D +ENCODING 61 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 6 1 4 +BITMAP +FF80 +FF80 +0000 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR 003E +ENCODING 62 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 2 +BITMAP +8000 +E000 +7C00 +0F00 +0180 +0F00 +7C00 +E000 +8000 +ENDCHAR +STARTCHAR 003F +ENCODING 63 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3E00 +7F00 +C300 +C180 +0180 +0300 +0600 +0C00 +0C00 +1800 +1800 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 0040 +ENCODING 64 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 18 1 -4 +BITMAP +03F000 +0FFC00 +1C0E00 +300300 +61D980 +47F980 +C63880 +CC1080 +8C1080 +883180 +883100 +CC7700 +CFFE00 +67BC00 +700180 +3C0700 +1FFE00 +03F800 +ENDCHAR +STARTCHAR 0041 +ENCODING 65 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0042 +ENCODING 66 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF00 +FF80 +C0C0 +C0C0 +C0C0 +C0C0 +FF80 +FF80 +C0C0 +C060 +C060 +C0C0 +FFC0 +FF80 +ENDCHAR +STARTCHAR 0043 +ENCODING 67 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 0044 +ENCODING 68 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +FF00 +FFC0 +C0E0 +C060 +C020 +C030 +C030 +C030 +C030 +C060 +C060 +C0E0 +FFC0 +FF00 +ENDCHAR +STARTCHAR 0045 +ENCODING 69 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0046 +ENCODING 70 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 9 14 2 0 +BITMAP +FF80 +FF80 +8000 +8000 +8000 +8000 +FF00 +FF00 +8000 +8000 +8000 +8000 +8000 +8000 +ENDCHAR +STARTCHAR 0047 +ENCODING 71 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 0048 +ENCODING 72 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 0049 +ENCODING 73 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 004A +ENCODING 74 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 14 1 0 +BITMAP +06 +06 +06 +06 +06 +06 +06 +06 +06 +06 +86 +C6 +FC +78 +ENDCHAR +STARTCHAR 004B +ENCODING 75 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +FC00 +F600 +E700 +C300 +C180 +C0C0 +C0E0 +C060 +ENDCHAR +STARTCHAR 004C +ENCODING 76 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 004D +ENCODING 77 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 14 1 0 +BITMAP +E018 +F038 +F028 +D028 +D868 +D868 +C848 +CCC8 +CCC8 +C488 +C788 +C788 +C308 +C308 +ENDCHAR +STARTCHAR 004E +ENCODING 78 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 004F +ENCODING 79 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 0050 +ENCODING 80 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF80 +FFC0 +C0E0 +C060 +C060 +C060 +C0C0 +FFC0 +FF80 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0051 +ENCODING 81 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 15 1 -1 +BITMAP +0F80 +3FE0 +7070 +6030 +C038 +C018 +C018 +C018 +C018 +C030 +61B0 +70E0 +3FE0 +0FB8 +0008 +ENDCHAR +STARTCHAR 0052 +ENCODING 82 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +FFC0 +FFE0 +C060 +C060 +C060 +C060 +FFE0 +FF80 +C300 +C180 +C0C0 +C060 +C060 +C030 +ENDCHAR +STARTCHAR 0053 +ENCODING 83 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0054 +ENCODING 84 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0055 +ENCODING 85 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0056 +ENCODING 86 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +C010 +6030 +6030 +6060 +3060 +3040 +10C0 +18C0 +1880 +0980 +0D80 +0D00 +0700 +0600 +ENDCHAR +STARTCHAR 0057 +ENCODING 87 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 14 0 0 +BITMAP +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 0058 +ENCODING 88 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +6030 +3060 +30C0 +18C0 +0D80 +0F00 +0700 +0700 +0D80 +1980 +18C0 +3060 +6070 +E030 +ENDCHAR +STARTCHAR 0059 +ENCODING 89 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 005A +ENCODING 90 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 005B +ENCODING 91 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 18 1 -4 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR 005C +ENCODING 92 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +80 +C0 +40 +40 +60 +20 +20 +20 +30 +10 +10 +18 +08 +08 +ENDCHAR +STARTCHAR 005D +ENCODING 93 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 18 0 -4 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR 005E +ENCODING 94 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 7 1 7 +BITMAP +10 +38 +28 +6C +44 +C6 +82 +ENDCHAR +STARTCHAR 005F +ENCODING 95 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 2 0 -4 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0060 +ENCODING 96 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 3 1 11 +BITMAP +C0 +60 +20 +ENDCHAR +STARTCHAR 0061 +ENCODING 97 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 0062 +ENCODING 98 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DC00 +ENDCHAR +STARTCHAR 0063 +ENCODING 99 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 0064 +ENCODING 100 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +01 +01 +01 +01 +39 +7D +C3 +C3 +81 +81 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 0065 +ENCODING 101 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0066 +ENCODING 102 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 14 0 0 +BITMAP +1C +3C +20 +20 +F8 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0067 +ENCODING 103 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +01 +C3 +FE +7C +ENDCHAR +STARTCHAR 0068 +ENCODING 104 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 0069 +ENCODING 105 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 006A +ENCODING 106 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 18 -1 -4 +BITMAP +30 +30 +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 006B +ENCODING 107 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +C7 +CE +DC +F8 +F8 +D8 +CC +C6 +C6 +C3 +ENDCHAR +STARTCHAR 006C +ENCODING 108 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 006D +ENCODING 109 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 10 1 0 +BITMAP +DC70 +FEF8 +E38C +C30C +C30C +C30C +C30C +C30C +C30C +C30C +ENDCHAR +STARTCHAR 006E +ENCODING 110 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 10 1 0 +BITMAP +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 006F +ENCODING 111 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0070 +ENCODING 112 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DC00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0071 +ENCODING 113 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +39 +7D +C3 +C3 +81 +81 +C3 +C3 +7D +39 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 0072 +ENCODING 114 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 10 1 0 +BITMAP +DC +F8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0073 +ENCODING 115 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 0074 +ENCODING 116 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +20 +20 +20 +F8 +F8 +20 +20 +20 +20 +20 +20 +38 +38 +ENDCHAR +STARTCHAR 0075 +ENCODING 117 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 10 1 0 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 0076 +ENCODING 118 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +C180 +6180 +6100 +2300 +3300 +3200 +1600 +1C00 +1C00 +0C00 +ENDCHAR +STARTCHAR 0077 +ENCODING 119 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 10 0 0 +BITMAP +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 0078 +ENCODING 120 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +6180 +6300 +3600 +1E00 +0C00 +1C00 +1E00 +3300 +6300 +E180 +ENDCHAR +STARTCHAR 0079 +ENCODING 121 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 007A +ENCODING 122 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +7F80 +7F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FF80 +FF80 +ENDCHAR +STARTCHAR 007B +ENCODING 123 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 18 1 -4 +BITMAP +38 +38 +60 +60 +60 +60 +60 +60 +C0 +C0 +60 +60 +60 +60 +60 +20 +38 +38 +ENDCHAR +STARTCHAR 007C +ENCODING 124 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 1 18 2 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 007D +ENCODING 125 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 18 0 -4 +BITMAP +E0 +F0 +30 +30 +30 +30 +30 +18 +1C +1C +18 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 007E +ENCODING 126 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 4 1 4 +BITMAP +7000 +FC80 +8F80 +0700 +ENDCHAR +STARTCHAR 00A0 +ENCODING 160 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 00A1 +ENCODING 161 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 14 2 -4 +BITMAP +C0 +C0 +00 +40 +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00A2 +ENCODING 162 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 -4 +BITMAP +02 +02 +02 +06 +3C +7F +E7 +C8 +C8 +C8 +D1 +F3 +7F +3C +20 +20 +20 +40 +ENDCHAR +STARTCHAR 00A3 +ENCODING 163 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +1F00 +3F80 +30C0 +6000 +6000 +2000 +FE00 +FE00 +3000 +3000 +2000 +7C40 +FFC0 +4380 +ENDCHAR +STARTCHAR 00A4 +ENCODING 164 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 8 1 2 +BITMAP +9D +FF +63 +C1 +C1 +63 +FF +9D +ENDCHAR +STARTCHAR 00A5 +ENCODING 165 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +C0C0 +60C0 +6180 +3180 +3300 +1B00 +1E00 +7FC0 +7FC0 +0C00 +7FC0 +7FC0 +0C00 +0C00 +ENDCHAR +STARTCHAR 00A6 +ENCODING 166 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 1 18 2 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +00 +00 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 00A7 +ENCODING 167 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +3C00 +7E00 +6300 +6000 +7000 +7C00 +8E00 +8300 +C180 +E180 +3900 +1E00 +0600 +0300 +C300 +6300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00A8 +ENCODING 168 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 2 1 12 +BITMAP +98 +98 +ENDCHAR +STARTCHAR 00A9 +ENCODING 169 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +0FC0 +1860 +2010 +4788 +CC4C +8804 +9804 +9804 +8844 +CCCC +4788 +2010 +1860 +0FC0 +ENDCHAR +STARTCHAR 00AA +ENCODING 170 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 7 0 7 +BITMAP +3C +44 +04 +7C +C4 +4C +7C +ENDCHAR +STARTCHAR 00AB +ENCODING 171 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 9 1 1 +BITMAP +13 +32 +26 +64 +CC +64 +26 +32 +13 +ENDCHAR +STARTCHAR 00AC +ENCODING 172 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 6 1 4 +BITMAP +FF80 +FF80 +0180 +0180 +0180 +0180 +ENDCHAR +STARTCHAR 00AD +ENCODING 173 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 2 1 4 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR 00AE +ENCODING 174 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +0FC0 +1860 +2010 +4F88 +C8CC +88C4 +8F84 +8904 +8884 +C8CC +4848 +2010 +1860 +0FC0 +ENDCHAR +STARTCHAR 00AF +ENCODING 175 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 2 0 15 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00B0 +ENCODING 176 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 5 5 1 9 +BITMAP +70 +C8 +88 +C8 +70 +ENDCHAR +STARTCHAR 00B1 +ENCODING 177 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +1800 +1800 +1800 +1800 +FF80 +FF80 +1800 +1800 +1800 +FF80 +FF80 +ENDCHAR +STARTCHAR 00B2 +ENCODING 178 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 7 0 7 +BITMAP +78 +4C +0C +18 +30 +60 +FC +ENDCHAR +STARTCHAR 00B3 +ENCODING 179 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 7 0 7 +BITMAP +78 +4C +0C +18 +0C +CC +78 +ENDCHAR +STARTCHAR 00B4 +ENCODING 180 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 3 2 11 +BITMAP +60 +40 +C0 +ENDCHAR +STARTCHAR 00B5 +ENCODING 181 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C1 +E3 +FF +DD +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00B6 +ENCODING 182 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 17 0 -3 +BITMAP +3FC0 +7FC0 +F980 +F980 +F980 +F980 +7980 +3980 +0980 +0980 +0980 +0980 +0980 +0980 +0980 +0980 +0980 +ENDCHAR +STARTCHAR 00B7 +ENCODING 183 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 2 2 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 00B8 +ENCODING 184 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 4 1 -4 +BITMAP +60 +70 +30 +E0 +ENDCHAR +STARTCHAR 00B9 +ENCODING 185 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 7 1 7 +BITMAP +20 +60 +E0 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR 00BA +ENCODING 186 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 7 0 7 +BITMAP +38 +44 +44 +C6 +44 +44 +38 +ENDCHAR +STARTCHAR 00BB +ENCODING 187 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 7 9 2 1 +BITMAP +98 +C8 +4C +66 +36 +66 +4C +C8 +98 +ENDCHAR +STARTCHAR 00BC +ENCODING 188 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +2018 +6030 +E020 +A040 +20C0 +2080 +2100 +030C +061C +041C +082C +186C +307E +200C +ENDCHAR +STARTCHAR 00BD +ENCODING 189 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +2010 +6030 +E020 +A040 +20C0 +2180 +2100 +023C +0664 +0C04 +080C +1018 +3030 +607E +ENDCHAR +STARTCHAR 00BE +ENCODING 190 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 16 14 0 0 +BITMAP +780C +4C18 +0C10 +1820 +0C60 +CC40 +7880 +0186 +030E +020E +0416 +0C36 +183F +1006 +ENDCHAR +STARTCHAR 00BF +ENCODING 191 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 9 14 1 -4 +BITMAP +0C00 +0C00 +0000 +0C00 +0C00 +0800 +1800 +3000 +6000 +4000 +C180 +6180 +7F00 +1E00 +ENDCHAR +STARTCHAR 00C0 +ENCODING 192 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0600 +0600 +0200 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C1 +ENCODING 193 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0300 +0200 +0600 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C2 +ENCODING 194 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0600 +0F00 +0980 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C3 +ENCODING 195 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0C80 +1F80 +1B80 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C4 +ENCODING 196 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 17 0 0 +BITMAP +0980 +0980 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C5 +ENCODING 197 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0600 +0900 +0900 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C6 +ENCODING 198 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 18 14 0 0 +BITMAP +03FFC0 +03FFC0 +066000 +066000 +0C6000 +0C6000 +087F80 +187F80 +1FE000 +3FE000 +306000 +606000 +607FC0 +C07FC0 +ENDCHAR +STARTCHAR 00C7 +ENCODING 199 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +0400 +0600 +0300 +0E00 +ENDCHAR +STARTCHAR 00C8 +ENCODING 200 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0C00 +0C00 +0600 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00C9 +ENCODING 201 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0600 +0600 +0C00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00CA +ENCODING 202 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +0A00 +1B00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00CB +ENCODING 203 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +1B00 +1B00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00CC +ENCODING 204 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 3 18 1 0 +BITMAP +C0 +40 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 00CD +ENCODING 205 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 18 2 0 +BITMAP +C0 +C0 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00CE +ENCODING 206 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 18 0 0 +BITMAP +70 +58 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00CF +ENCODING 207 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 17 0 0 +BITMAP +D8 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00D0 +ENCODING 208 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +7F80 +7FE0 +6070 +6030 +6010 +6018 +FE18 +FE18 +6018 +6030 +6030 +6070 +7FE0 +7F80 +ENDCHAR +STARTCHAR 00D1 +ENCODING 209 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0C80 +1F80 +1300 +0000 +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 00D2 +ENCODING 210 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0C00 +0600 +0200 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D3 +ENCODING 211 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0300 +0300 +0600 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D4 +ENCODING 212 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0700 +0D00 +0D80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D5 +ENCODING 213 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0EC0 +0F80 +1B80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D6 +ENCODING 214 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 17 1 0 +BITMAP +0D80 +0D80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D7 +ENCODING 215 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 7 7 2 3 +BITMAP +82 +C6 +7C +38 +7C +C6 +82 +ENDCHAR +STARTCHAR 00D8 +ENCODING 216 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 15 1 -1 +BITMAP +0F88 +3FD0 +7060 +6070 +C0D0 +C198 +C318 +C618 +CC18 +D818 +7030 +7070 +7FE0 +DF80 +8000 +ENDCHAR +STARTCHAR 00D9 +ENCODING 217 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0C00 +0400 +0600 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DA +ENCODING 218 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0300 +0600 +0400 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DB +ENCODING 219 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0600 +0F00 +1900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DC +ENCODING 220 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 17 1 0 +BITMAP +1900 +1900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DD +ENCODING 221 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0300 +0300 +0600 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 00DE +ENCODING 222 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C000 +C000 +C000 +FF80 +FFC0 +C0E0 +C060 +C060 +C0E0 +FFC0 +FF80 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 00DF +ENCODING 223 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +3C00 +7E00 +6300 +C300 +C200 +C600 +C400 +C600 +C380 +C1C0 +C0C0 +D8C0 +CFC0 +C780 +ENDCHAR +STARTCHAR 00E0 +ENCODING 224 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3800 +1800 +0800 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E1 +ENCODING 225 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E2 +ENCODING 226 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E3 +ENCODING 227 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3200 +7E00 +4E00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E4 +ENCODING 228 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2600 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E5 +ENCODING 229 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +1800 +2400 +2400 +2400 +1800 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E6 +ENCODING 230 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 10 1 0 +BITMAP +3E78 +7FFC +C386 +0F06 +7FFE +F3FE +8300 +C786 +FFFC +7878 +ENDCHAR +STARTCHAR 00E7 +ENCODING 231 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +10 +18 +0C +38 +ENDCHAR +STARTCHAR 00E8 +ENCODING 232 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3000 +1800 +0800 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00E9 +ENCODING 233 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00EA +ENCODING 234 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00EB +ENCODING 235 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2600 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00EC +ENCODING 236 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 3 14 1 0 +BITMAP +C0 +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 00ED +ENCODING 237 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 3 14 2 0 +BITMAP +60 +C0 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00EE +ENCODING 238 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +30 +78 +C8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00EF +ENCODING 239 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +C8 +C8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00F0 +ENCODING 240 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3200 +1E00 +3C00 +2600 +3B00 +7F00 +C300 +C180 +8180 +8180 +C180 +E300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F1 +ENCODING 241 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +3B +3E +6E +00 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 00F2 +ENCODING 242 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3000 +1800 +0800 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F3 +ENCODING 243 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F4 +ENCODING 244 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F5 +ENCODING 245 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3200 +7E00 +4E00 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F6 +ENCODING 246 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2600 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F7 +ENCODING 247 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 8 1 2 +BITMAP +1800 +1800 +0000 +FF80 +FF80 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 00F8 +ENCODING 248 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 9 12 1 -1 +BITMAP +0080 +1E80 +7F00 +6380 +C680 +C480 +C880 +D180 +7380 +7F00 +5E00 +8000 +ENDCHAR +STARTCHAR 00F9 +ENCODING 249 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +18 +18 +0C +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 00FA +ENCODING 250 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +0C +0C +18 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 00FB +ENCODING 251 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +18 +3C +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 00FC +ENCODING 252 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 13 1 0 +BITMAP +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 00FD +ENCODING 253 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +0C +08 +18 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 00FE +ENCODING 254 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +C000 +C000 +C000 +C000 +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DC00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 00FF +ENCODING 255 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 17 1 -4 +BITMAP +64 +64 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0100 +ENCODING 256 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 16 0 0 +BITMAP +1F80 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0101 +ENCODING 257 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +3E00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 0102 +ENCODING 258 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0880 +0980 +0700 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0103 +ENCODING 259 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 0104 +ENCODING 260 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 18 0 -4 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +0010 +0020 +0030 +001C +ENDCHAR +STARTCHAR 0105 +ENCODING 261 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 14 1 -4 +BITMAP +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +0100 +0100 +0100 +01E0 +ENDCHAR +STARTCHAR 0106 +ENCODING 262 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0300 +0300 +0600 +0000 +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 0107 +ENCODING 263 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +08 +18 +00 +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 0108 +ENCODING 264 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0600 +0F00 +0980 +0000 +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 0109 +ENCODING 265 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +1C +14 +36 +00 +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 010A +ENCODING 266 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 17 1 0 +BITMAP +0600 +0600 +0000 +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 010B +ENCODING 267 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +18 +18 +00 +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 010C +ENCODING 268 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0D80 +0D00 +0700 +0000 +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 010D +ENCODING 269 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +26 +3C +18 +00 +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 010E +ENCODING 270 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +3600 +1400 +1C00 +0000 +FF00 +FFC0 +C0E0 +C060 +C020 +C030 +C030 +C030 +C030 +C060 +C060 +C0E0 +FFC0 +FF00 +ENDCHAR +STARTCHAR 010F +ENCODING 271 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +0160 +0160 +0120 +0140 +3D00 +7F00 +C300 +C300 +8100 +8100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 0110 +ENCODING 272 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +7F80 +7FE0 +6070 +6030 +6010 +6018 +FE18 +FE18 +6018 +6030 +6030 +6070 +7FE0 +7F80 +ENDCHAR +STARTCHAR 0111 +ENCODING 273 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +0100 +1FC0 +1FC0 +0100 +3900 +7D00 +C300 +C300 +8100 +8100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 0112 +ENCODING 274 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 16 1 0 +BITMAP +1F80 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0113 +ENCODING 275 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +7E00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0114 +ENCODING 276 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1100 +1100 +0E00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0115 +ENCODING 277 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +2200 +2200 +1C00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0116 +ENCODING 278 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +0600 +0600 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0117 +ENCODING 279 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +1C00 +1C00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0118 +ENCODING 280 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +0100 +0100 +0100 +01E0 +ENDCHAR +STARTCHAR 0119 +ENCODING 281 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +0800 +0800 +0800 +0F00 +ENDCHAR +STARTCHAR 011A +ENCODING 282 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1300 +1E00 +0C00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 011B +ENCODING 283 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3600 +3400 +1C00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 011C +ENCODING 284 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0300 +0780 +0CC0 +0000 +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 011D +ENCODING 285 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 -4 +BITMAP +18 +3C +66 +00 +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +01 +C3 +FE +7C +ENDCHAR +STARTCHAR 011E +ENCODING 286 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0C40 +0480 +0780 +0000 +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 011F +ENCODING 287 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 -4 +BITMAP +22 +26 +1C +00 +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +01 +C3 +FE +7C +ENDCHAR +STARTCHAR 0120 +ENCODING 288 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 17 1 0 +BITMAP +0300 +0300 +0000 +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 0121 +ENCODING 289 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 17 1 -4 +BITMAP +18 +18 +00 +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +01 +C3 +FE +7C +ENDCHAR +STARTCHAR 0122 +ENCODING 290 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 -4 +BITMAP +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +0300 +0380 +0180 +0700 +ENDCHAR +STARTCHAR 0123 +ENCODING 291 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 19 1 -4 +BITMAP +08 +10 +18 +18 +00 +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 0124 +ENCODING 292 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 18 2 0 +BITMAP +0C00 +1E00 +1300 +0000 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 0125 +ENCODING 293 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 0 +BITMAP +0C +1E +33 +00 +C0 +C0 +C0 +C0 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 0126 +ENCODING 294 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +2030 +FFF8 +FFF8 +2030 +2030 +3FF0 +3FF0 +2030 +2030 +2030 +2030 +2030 +2030 +2030 +ENDCHAR +STARTCHAR 0127 +ENCODING 295 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 0 0 +BITMAP +6000 +FC00 +FC00 +6000 +6F00 +7F80 +7180 +6080 +6080 +6080 +6080 +6080 +6080 +6080 +ENDCHAR +STARTCHAR 0128 +ENCODING 296 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 7 18 -1 0 +BITMAP +76 +7C +DC +00 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 0129 +ENCODING 297 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 14 0 0 +BITMAP +EC +FC +98 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012A +ENCODING 298 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 16 0 0 +BITMAP +FC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012B +ENCODING 299 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 0 0 +BITMAP +FC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012C +ENCODING 300 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 18 0 0 +BITMAP +88 +C8 +70 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012D +ENCODING 301 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +88 +C8 +70 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012E +ENCODING 302 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 18 2 -4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR 012F +ENCODING 303 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 18 1 -4 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +70 +ENDCHAR +STARTCHAR 0130 +ENCODING 304 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 17 2 0 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0131 +ENCODING 305 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 10 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0132 +ENCODING 306 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 2 0 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C860 +CC60 +CFC0 +C780 +ENDCHAR +STARTCHAR 0133 +ENCODING 307 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 18 1 -4 +BITMAP +C4 +C4 +00 +00 +C4 +C4 +C4 +C4 +C4 +C4 +C4 +C4 +C4 +C4 +04 +04 +1C +1C +ENDCHAR +STARTCHAR 0134 +ENCODING 308 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 18 1 0 +BITMAP +0700 +0D00 +0D80 +0000 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +8600 +C600 +FC00 +7800 +ENDCHAR +STARTCHAR 0135 +ENCODING 309 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 6 18 -1 -4 +BITMAP +30 +78 +4C +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0136 +ENCODING 310 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +FC00 +F600 +E700 +C300 +C180 +C0C0 +C0E0 +C060 +0000 +0700 +0100 +0F00 +ENDCHAR +STARTCHAR 0137 +ENCODING 311 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +C0 +C0 +C0 +C0 +C7 +CE +DC +F8 +F8 +D8 +CC +C6 +C6 +C3 +00 +0C +06 +1C +ENDCHAR +STARTCHAR 0138 +ENCODING 312 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C7 +CE +D8 +F0 +F8 +C8 +CC +C6 +C6 +C3 +ENDCHAR +STARTCHAR 0139 +ENCODING 313 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +1800 +3000 +3000 +0000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 013A +ENCODING 314 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 18 1 0 +BITMAP +60 +C0 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 013B +ENCODING 315 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +0000 +0E00 +0200 +1E00 +ENDCHAR +STARTCHAR 013C +ENCODING 316 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 18 0 -4 +BITMAP +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +00 +70 +30 +E0 +ENDCHAR +STARTCHAR 013D +ENCODING 317 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C300 +C300 +C200 +C200 +C200 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 013E +ENCODING 318 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 14 1 0 +BITMAP +D8 +D8 +D0 +D0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 013F +ENCODING 319 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C300 +C300 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 0140 +ENCODING 320 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +D8 +D8 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0141 +ENCODING 321 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +6000 +6000 +6000 +6400 +6C00 +7800 +7000 +E000 +E000 +6000 +6000 +6000 +7FC0 +7FC0 +ENDCHAR +STARTCHAR 0142 +ENCODING 322 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 14 0 0 +BITMAP +60 +60 +60 +60 +70 +70 +60 +E0 +E0 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 0143 +ENCODING 323 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0600 +0600 +0400 +0000 +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 0144 +ENCODING 324 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +0C +0C +18 +00 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 0145 +ENCODING 325 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 -4 +BITMAP +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +0000 +0700 +0180 +0700 +ENDCHAR +STARTCHAR 0146 +ENCODING 326 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +00 +1C +04 +3C +ENDCHAR +STARTCHAR 0147 +ENCODING 327 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +1900 +0F00 +0600 +0000 +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 0148 +ENCODING 328 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +36 +34 +1C +00 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 0149 +ENCODING 329 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +C000 +C000 +4000 +8000 +B780 +3FC0 +38C0 +30C0 +30C0 +30C0 +30C0 +30C0 +30C0 +30C0 +ENDCHAR +STARTCHAR 014A +ENCODING 330 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 2 0 +BITMAP +9F00 +BF80 +E1C0 +C0C0 +C060 +8060 +8060 +8060 +8060 +8060 +80C0 +80C0 +8780 +8F00 +ENDCHAR +STARTCHAR 014B +ENCODING 331 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +01 +03 +07 +06 +ENDCHAR +STARTCHAR 014C +ENCODING 332 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 16 1 0 +BITMAP +0F80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 014D +ENCODING 333 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +7E00 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 014E +ENCODING 334 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0880 +0880 +0700 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 014F +ENCODING 335 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +2200 +2600 +1C00 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0150 +ENCODING 336 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0CC0 +0D80 +0900 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 0151 +ENCODING 337 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1B00 +3600 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0152 +ENCODING 338 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 14 1 0 +BITMAP +1F7F80 +3FFF80 +71E000 +60E000 +C06000 +C06000 +C07F80 +C07F80 +C06000 +C06000 +60E000 +71E000 +3FFF80 +1F7F80 +ENDCHAR +STARTCHAR 0153 +ENCODING 339 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 16 10 1 0 +BITMAP +3C3C +7F7E +E3C3 +C183 +C1FF +C1FF +C180 +E3C3 +7F7E +3C3C +ENDCHAR +STARTCHAR 0154 +ENCODING 340 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0600 +0C00 +0800 +0000 +FFC0 +FFE0 +C060 +C060 +C060 +C060 +FFE0 +FF80 +C300 +C180 +C0C0 +C060 +C060 +C030 +ENDCHAR +STARTCHAR 0155 +ENCODING 341 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 14 1 0 +BITMAP +30 +30 +60 +00 +DC +F8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0156 +ENCODING 342 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +FFC0 +FFE0 +C060 +C060 +C060 +C060 +FFE0 +FF80 +C300 +C180 +C0C0 +C060 +C060 +C030 +0000 +0700 +0180 +0700 +ENDCHAR +STARTCHAR 0157 +ENCODING 343 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 14 1 -4 +BITMAP +DC +F8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +70 +10 +F0 +ENDCHAR +STARTCHAR 0158 +ENCODING 344 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +3300 +1E00 +0C00 +0000 +FFC0 +FFE0 +C060 +C060 +C060 +C060 +FFE0 +FF80 +C300 +C180 +C0C0 +C060 +C060 +C030 +ENDCHAR +STARTCHAR 0159 +ENCODING 345 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 14 1 0 +BITMAP +D8 +50 +70 +00 +DC +F8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 015A +ENCODING 346 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0600 +0C00 +0800 +0000 +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 015B +ENCODING 347 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +18 +10 +00 +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 015C +ENCODING 348 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0C00 +1A00 +1300 +0000 +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 015D +ENCODING 349 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +18 +3C +66 +00 +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 015E +ENCODING 350 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +0400 +0E00 +0200 +1C00 +ENDCHAR +STARTCHAR 015F +ENCODING 351 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +10 +18 +08 +38 +ENDCHAR +STARTCHAR 0160 +ENCODING 352 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +3300 +1E00 +0C00 +0000 +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0161 +ENCODING 353 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +6C +2C +38 +00 +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 0162 +ENCODING 354 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 19 0 -5 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0000 +0600 +0600 +0200 +0400 +ENDCHAR +STARTCHAR 0163 +ENCODING 355 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 18 0 -5 +BITMAP +20 +20 +20 +F8 +F8 +20 +20 +20 +20 +20 +20 +38 +38 +00 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 0164 +ENCODING 356 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 18 0 0 +BITMAP +1900 +0F00 +0600 +0000 +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0165 +ENCODING 357 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 14 0 0 +BITMAP +06 +26 +22 +22 +F8 +F8 +20 +20 +20 +20 +20 +20 +38 +38 +ENDCHAR +STARTCHAR 0166 +ENCODING 358 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +3FC0 +3FC0 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0167 +ENCODING 359 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +20 +60 +60 +F8 +F8 +60 +60 +F8 +F8 +60 +60 +78 +38 +ENDCHAR +STARTCHAR 0168 +ENCODING 360 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0C80 +1F80 +1300 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0169 +ENCODING 361 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +32 +7E +6E +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 016A +ENCODING 362 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 16 1 0 +BITMAP +1F80 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 016B +ENCODING 363 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 12 1 0 +BITMAP +7E +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 016C +ENCODING 364 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +1180 +0900 +0E00 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 016D +ENCODING 365 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +22 +26 +1C +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 016E +ENCODING 366 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0600 +0A00 +0900 +0A00 +C660 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 016F +ENCODING 367 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 16 1 0 +BITMAP +18 +24 +24 +24 +18 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 0170 +ENCODING 368 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0CC0 +0D80 +1900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0171 +ENCODING 369 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +36 +36 +64 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 0172 +ENCODING 370 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 -4 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +0400 +0400 +0400 +0380 +ENDCHAR +STARTCHAR 0173 +ENCODING 371 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -4 +BITMAP +C100 +C100 +C100 +C100 +C100 +C100 +C300 +C300 +7F00 +3D00 +0100 +0300 +0300 +01C0 +ENDCHAR +STARTCHAR 0174 +ENCODING 372 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 18 0 0 +BITMAP +00C000 +01E000 +033000 +000000 +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 0175 +ENCODING 373 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +0300 +0780 +0CC0 +0000 +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 0176 +ENCODING 374 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0700 +0500 +0D80 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0177 +ENCODING 375 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +18 +3C +26 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0178 +ENCODING 376 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +0980 +0980 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0179 +ENCODING 377 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 18 0 0 +BITMAP +0600 +0600 +0400 +0000 +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 017A +ENCODING 378 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0600 +0C00 +0800 +0000 +7F80 +7F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FF80 +FF80 +ENDCHAR +STARTCHAR 017B +ENCODING 379 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 17 0 0 +BITMAP +0600 +0600 +0000 +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 017C +ENCODING 380 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +0C00 +0C00 +0000 +7F80 +7F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FF80 +FF80 +ENDCHAR +STARTCHAR 017D +ENCODING 381 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 18 0 0 +BITMAP +1900 +0F00 +0600 +0000 +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 017E +ENCODING 382 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +3300 +1E00 +0C00 +0000 +7F80 +7F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FF80 +FF80 +ENDCHAR +STARTCHAR 017F +ENCODING 383 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 14 1 0 +BITMAP +78 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 018F +ENCODING 399 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6030 +6030 +0030 +FFF0 +FFF0 +C010 +C030 +6030 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0192 +ENCODING 402 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 18 0 -4 +BITMAP +03C0 +03C0 +0200 +0600 +1F80 +1F80 +0600 +0400 +0400 +0C00 +0C00 +0C00 +0800 +0800 +1800 +1800 +7800 +F000 +ENDCHAR +STARTCHAR 01A0 +ENCODING 416 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 01A1 +ENCODING 417 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 01AF +ENCODING 431 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01B0 +ENCODING 432 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 01CD +ENCODING 461 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0980 +0F00 +0600 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 01CE +ENCODING 462 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3600 +1400 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 01CF +ENCODING 463 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 18 0 0 +BITMAP +D8 +58 +70 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 01D0 +ENCODING 464 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 14 0 0 +BITMAP +98 +F0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 01D1 +ENCODING 465 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0D80 +0500 +0700 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 01D2 +ENCODING 466 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +2600 +3400 +1800 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 01D3 +ENCODING 467 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +1980 +0F00 +0600 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01D4 +ENCODING 468 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +36 +34 +1C +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01D5 +ENCODING 469 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0F00 +0000 +0900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01D6 +ENCODING 470 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 15 1 0 +BITMAP +7E +00 +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01D7 +ENCODING 471 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0300 +0600 +0900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01D8 +ENCODING 472 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 17 1 0 +BITMAP +0C +0C +18 +00 +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01D9 +ENCODING 473 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0F00 +0600 +0900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01DA +ENCODING 474 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 17 1 0 +BITMAP +36 +34 +1C +00 +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01DB +ENCODING 475 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0C00 +0600 +0900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01DC +ENCODING 476 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 17 1 0 +BITMAP +30 +18 +08 +00 +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01FA +ENCODING 506 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 20 0 0 +BITMAP +0300 +0300 +0600 +0900 +0900 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 01FB +ENCODING 507 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 20 1 0 +BITMAP +0600 +0C00 +0800 +0000 +1800 +2400 +2400 +2400 +1800 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 01FC +ENCODING 508 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 18 18 0 0 +BITMAP +006000 +006000 +00C000 +000000 +03FFC0 +03FFC0 +066000 +066000 +0C6000 +0C6000 +087F80 +187F80 +1FE000 +3FE000 +306000 +606000 +607FC0 +C07FC0 +ENDCHAR +STARTCHAR 01FD +ENCODING 509 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +00C0 +0180 +0100 +0000 +3E78 +7FFC +C386 +0F06 +7FFE +F3FE +8300 +C786 +FFFC +7878 +ENDCHAR +STARTCHAR 01FE +ENCODING 510 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 19 1 -1 +BITMAP +0300 +0300 +0200 +0000 +0F88 +3FD0 +7060 +6070 +C0D0 +C198 +C318 +C618 +CC18 +D818 +7030 +7070 +7FE0 +DF80 +8000 +ENDCHAR +STARTCHAR 01FF +ENCODING 511 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 9 15 1 -1 +BITMAP +0600 +0400 +0C00 +0080 +1E80 +7F00 +6380 +C680 +C480 +C880 +D180 +7380 +7F00 +5E00 +8000 +ENDCHAR +STARTCHAR 0259 +ENCODING 601 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +FF00 +C300 +0180 +FF80 +FF80 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 02C6 +ENCODING 710 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 3 1 11 +BITMAP +60 +F0 +98 +ENDCHAR +STARTCHAR 02C7 +ENCODING 711 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 3 1 11 +BITMAP +D8 +D0 +70 +ENDCHAR +STARTCHAR 02C9 +ENCODING 713 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 1 0 11 +BITMAP +FC +ENDCHAR +STARTCHAR 02D8 +ENCODING 728 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 11 +BITMAP +C4 +4C +38 +ENDCHAR +STARTCHAR 02D9 +ENCODING 729 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 2 2 11 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 02DA +ENCODING 730 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 5 1 9 +BITMAP +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR 02DB +ENCODING 731 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 4 2 -4 +BITMAP +80 +80 +80 +F0 +ENDCHAR +STARTCHAR 02DC +ENCODING 732 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 11 +BITMAP +64 +FC +9C +ENDCHAR +STARTCHAR 02DD +ENCODING 733 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 1 11 +BITMAP +EC +D8 +90 +ENDCHAR +STARTCHAR 0300 +ENCODING 768 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -5 15 +BITMAP +C0 +60 +20 +ENDCHAR +STARTCHAR 0301 +ENCODING 769 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -3 15 +BITMAP +60 +C0 +80 +ENDCHAR +STARTCHAR 0303 +ENCODING 771 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -8 15 +BITMAP +EC +98 +ENDCHAR +STARTCHAR 0309 +ENCODING 777 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -4 15 +BITMAP +E0 +30 +60 +ENDCHAR +STARTCHAR 0323 +ENCODING 803 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 037E +ENCODING 894 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 13 2 -3 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +40 +80 +80 +ENDCHAR +STARTCHAR 0384 +ENCODING 900 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 3 2 11 +BITMAP +60 +40 +C0 +ENDCHAR +STARTCHAR 0385 +ENCODING 901 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 7 3 0 11 +BITMAP +18 +96 +A6 +ENDCHAR +STARTCHAR 0386 +ENCODING 902 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +3600 +6700 +4F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0387 +ENCODING 903 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 2 2 8 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 0388 +ENCODING 904 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 -1 0 +BITMAP +67FE +67FE +C600 +0600 +0600 +0600 +07FC +07FC +0600 +0600 +0600 +0600 +07FE +07FE +ENDCHAR +STARTCHAR 0389 +ENCODING 905 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 -1 0 +BITMAP +6C06 +6C06 +CC06 +0C06 +0C06 +0C06 +0FFE +0FFE +0C06 +0C06 +0C06 +0C06 +0C06 +0C06 +ENDCHAR +STARTCHAR 038A +ENCODING 906 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 14 -1 0 +BITMAP +6C +6C +CC +0C +0C +0C +0C +0C +0C +0C +0C +0C +0C +0C +ENDCHAR +STARTCHAR 038C +ENCODING 908 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 -1 0 +BITMAP +63E0 +6FF8 +DC18 +180C +300C +3006 +3006 +3006 +3006 +300C +180C +1C18 +0FF8 +03E0 +ENDCHAR +STARTCHAR 038E +ENCODING 910 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 14 -1 0 +BITMAP +660180 +630300 +C30600 +018600 +018C00 +00D800 +007800 +007000 +003000 +003000 +003000 +003000 +003000 +003000 +ENDCHAR +STARTCHAR 038F +ENCODING 911 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 14 14 -1 0 +BITMAP +63E0 +6FF0 +DC38 +181C +300C +300C +300C +300C +300C +180C +0818 +0C30 +3E7C +3E7C +ENDCHAR +STARTCHAR 0390 +ENCODING 912 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 6 15 -1 0 +BITMAP +18 +94 +A4 +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 0391 +ENCODING 913 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0392 +ENCODING 914 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF00 +FF80 +C0C0 +C0C0 +C0C0 +C0C0 +FF80 +FF80 +C0C0 +C060 +C060 +C0C0 +FFC0 +FF80 +ENDCHAR +STARTCHAR 0393 +ENCODING 915 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 2 0 +BITMAP +FF +FF +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0394 +ENCODING 916 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3060 +2060 +6060 +6030 +7FF0 +FFF8 +ENDCHAR +STARTCHAR 0395 +ENCODING 917 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0396 +ENCODING 918 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0397 +ENCODING 919 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 0398 +ENCODING 920 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +CF98 +CF98 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 0399 +ENCODING 921 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 039A +ENCODING 922 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +FC00 +F600 +E700 +C300 +C180 +C0C0 +C0E0 +C060 +ENDCHAR +STARTCHAR 039B +ENCODING 923 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1880 +18C0 +10C0 +3040 +3060 +6060 +6030 +4030 +C030 +ENDCHAR +STARTCHAR 039C +ENCODING 924 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 14 1 0 +BITMAP +E018 +F038 +F028 +D028 +D868 +D868 +C848 +CCC8 +CCC8 +C488 +C788 +C788 +C308 +C308 +ENDCHAR +STARTCHAR 039D +ENCODING 925 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 039E +ENCODING 926 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FFC0 +FFC0 +0000 +0000 +0000 +0000 +7F80 +7F80 +0000 +0000 +0000 +0000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 039F +ENCODING 927 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 03A0 +ENCODING 928 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 03A1 +ENCODING 929 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF80 +FFC0 +C0E0 +C060 +C060 +C060 +C0C0 +FFC0 +FF80 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 03A3 +ENCODING 931 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FFC0 +FFC0 +6000 +3000 +1800 +0C00 +0600 +0C00 +1800 +3800 +7000 +6000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 03A4 +ENCODING 932 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 03A5 +ENCODING 933 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 03A6 +ENCODING 934 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0200 +0200 +1FC0 +7FF0 +E238 +C218 +C218 +C218 +C218 +E238 +7FF0 +1FC0 +0200 +0200 +ENDCHAR +STARTCHAR 03A7 +ENCODING 935 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +6030 +3060 +30C0 +18C0 +0D80 +0F00 +0700 +0700 +0D80 +1980 +18C0 +3060 +6070 +E030 +ENDCHAR +STARTCHAR 03A8 +ENCODING 936 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +C30C +C30C +C30C +C30C +C30C +C30C +E318 +7338 +3FF0 +1FE0 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 03A9 +ENCODING 937 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6070 +C030 +C030 +C030 +C030 +C030 +4020 +6060 +30C0 +F9F0 +F9F0 +ENDCHAR +STARTCHAR 03AA +ENCODING 938 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 17 0 0 +BITMAP +D8 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 03AB +ENCODING 939 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +0980 +0980 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 03AC +ENCODING 940 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3D80 +7F80 +C380 +C300 +C100 +C100 +C300 +C380 +7F80 +3D80 +ENDCHAR +STARTCHAR 03AD +ENCODING 941 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 14 1 0 +BITMAP +18 +18 +10 +00 +78 +7C +C4 +C0 +70 +70 +C0 +C4 +FE +78 +ENDCHAR +STARTCHAR 03AE +ENCODING 942 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 -4 +BITMAP +0C +0C +08 +00 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 03AF +ENCODING 943 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 14 1 0 +BITMAP +60 +40 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 03B0 +ENCODING 944 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +4B +53 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR 03B1 +ENCODING 945 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3D80 +7F80 +C380 +C300 +C100 +C100 +C300 +C380 +7F80 +3D80 +ENDCHAR +STARTCHAR 03B2 +ENCODING 946 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +3E00 +7F00 +6300 +C100 +C300 +DC00 +DF00 +C380 +C180 +C180 +C180 +E380 +FF00 +DE00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 03B3 +ENCODING 947 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 -4 +BITMAP +C180 +6180 +6100 +2300 +3300 +3200 +1600 +1E00 +1C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 03B4 +ENCODING 948 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +7F00 +7F00 +3000 +1800 +3E00 +7F00 +E300 +C180 +8180 +8180 +C180 +E300 +7F00 +3C00 +ENDCHAR +STARTCHAR 03B5 +ENCODING 949 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +78 +7C +C4 +C0 +70 +70 +C0 +C4 +FE +78 +ENDCHAR +STARTCHAR 03B6 +ENCODING 950 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 18 1 -4 +BITMAP +7E +7E +0C +18 +30 +60 +40 +C0 +C0 +80 +80 +C0 +FC +7E +06 +06 +0C +0C +ENDCHAR +STARTCHAR 03B7 +ENCODING 951 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 03B8 +ENCODING 952 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +6300 +C100 +C180 +C180 +FF80 +FF80 +C180 +C180 +C100 +6300 +7E00 +3C00 +ENDCHAR +STARTCHAR 03B9 +ENCODING 953 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 03BA +ENCODING 954 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C7 +CE +D8 +F0 +F0 +D8 +CC +CC +C6 +C3 +ENDCHAR +STARTCHAR 03BB +ENCODING 955 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +1000 +1800 +1800 +0800 +0C00 +1C00 +1E00 +1600 +3600 +3300 +6300 +6100 +6180 +C180 +ENDCHAR +STARTCHAR 03BC +ENCODING 956 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C1 +E3 +FF +DD +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 03BD +ENCODING 957 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +C180 +6180 +6100 +2300 +3300 +3200 +1600 +1C00 +1C00 +0C00 +ENDCHAR +STARTCHAR 03BE +ENCODING 958 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 18 1 -4 +BITMAP +3C +7C +C0 +C0 +40 +7C +1C +60 +C0 +C0 +C0 +C0 +7C +3E +06 +06 +0E +0C +ENDCHAR +STARTCHAR 03BF +ENCODING 959 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 03C0 +ENCODING 960 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 10 0 0 +BITMAP +FFF8 +FFF8 +1840 +1840 +1840 +1840 +1840 +1840 +1840 +1840 +ENDCHAR +STARTCHAR 03C1 +ENCODING 961 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +3E00 +7F00 +6380 +C180 +C180 +C180 +C180 +E380 +FF00 +DE00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 03C2 +ENCODING 962 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -4 +BITMAP +1F +3F +60 +C0 +C0 +80 +C0 +E0 +7C +3E +03 +02 +1E +1C +ENDCHAR +STARTCHAR 03C3 +ENCODING 963 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +3FC0 +7FC0 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 03C4 +ENCODING 964 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +FE +FE +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 03C5 +ENCODING 965 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR 03C6 +ENCODING 966 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 -4 +BITMAP +3780 +6FC0 +CCC0 +CC60 +8C60 +8C60 +CCC0 +EDC0 +7F80 +3F00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 03C7 +ENCODING 967 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 14 0 -4 +BITMAP +6080 +6180 +3300 +3300 +1E00 +1E00 +0C00 +0C00 +1E00 +1600 +3300 +2100 +6180 +C0C0 +ENDCHAR +STARTCHAR 03C8 +ENCODING 968 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 -4 +BITMAP +C620 +C620 +C620 +C620 +C620 +C620 +C620 +C660 +66C0 +3F80 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 03C9 +ENCODING 969 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 10 1 0 +BITMAP +6030 +4010 +C218 +C218 +C218 +C218 +C618 +C538 +7DF0 +38E0 +ENDCHAR +STARTCHAR 03CA +ENCODING 970 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 13 0 0 +BITMAP +98 +98 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 03CB +ENCODING 971 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +36 +36 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR 03CC +ENCODING 972 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 03CD +ENCODING 973 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +0C +18 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR 03CE +ENCODING 974 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0180 +0300 +0200 +0000 +6030 +4010 +C218 +C218 +C218 +C218 +C618 +C538 +7DF0 +38E0 +ENDCHAR +STARTCHAR 0401 +ENCODING 1025 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +1B00 +1B00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0402 +ENCODING 1026 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 16 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +06F8 +07FE +0706 +0603 +0603 +0603 +0646 +067E +063C +ENDCHAR +STARTCHAR 0403 +ENCODING 1027 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +FF80 +FF80 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0404 +ENCODING 1028 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6070 +C020 +C000 +FE00 +FE00 +C000 +C000 +6030 +7060 +3FE0 +0F80 +ENDCHAR +STARTCHAR 0405 +ENCODING 1029 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0406 +ENCODING 1030 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0407 +ENCODING 1031 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 17 0 0 +BITMAP +D8 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 0408 +ENCODING 1032 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 14 1 0 +BITMAP +06 +06 +06 +06 +06 +06 +06 +06 +06 +06 +86 +C6 +FC +78 +ENDCHAR +STARTCHAR 0409 +ENCODING 1033 +SWIDTH 1028 0 +DWIDTH 20 0 +BBX 19 14 0 0 +BITMAP +3FE000 +3FE000 +306000 +306000 +306000 +306000 +307F80 +307FE0 +306060 +306060 +306060 +B06060 +F07FE0 +607F80 +ENDCHAR +STARTCHAR 040A +ENCODING 1034 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 16 14 2 0 +BITMAP +8300 +8300 +8300 +8300 +8300 +8300 +FFFE +FFFF +8303 +8301 +8301 +8303 +83FF +83FE +ENDCHAR +STARTCHAR 040B +ENCODING 1035 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +06F8 +07FC +0706 +0606 +0602 +0602 +0602 +0602 +0602 +ENDCHAR +STARTCHAR 040C +ENCODING 1036 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 18 1 0 +BITMAP +0600 +0C00 +0C00 +0000 +C1C0 +C3C0 +C300 +C600 +C600 +CC00 +F800 +CC00 +C600 +C600 +C300 +C380 +C180 +C1C0 +ENDCHAR +STARTCHAR 040E +ENCODING 1038 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 18 0 0 +BITMAP +0880 +0880 +0700 +0000 +C030 +6020 +6060 +3040 +10C0 +1880 +0980 +0D00 +0700 +0600 +0600 +0600 +3C00 +3800 +ENDCHAR +STARTCHAR 040F +ENCODING 1039 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 -4 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +FFE0 +FFE0 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0410 +ENCODING 1040 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0411 +ENCODING 1041 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 2 0 +BITMAP +FF00 +FF00 +8000 +8000 +8000 +8000 +FF00 +FF80 +81C0 +80C0 +80C0 +81C0 +FF80 +FF00 +ENDCHAR +STARTCHAR 0412 +ENCODING 1042 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF00 +FF80 +C0C0 +C0C0 +C0C0 +C0C0 +FF80 +FF80 +C0C0 +C060 +C060 +C0C0 +FFC0 +FF80 +ENDCHAR +STARTCHAR 0413 +ENCODING 1043 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +FF80 +FF80 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0414 +ENCODING 1044 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 17 0 -3 +BITMAP +1FE0 +1FE0 +1060 +1060 +1060 +1060 +1060 +3060 +3060 +3060 +2060 +6060 +FFF0 +FFF0 +C010 +C010 +C010 +ENDCHAR +STARTCHAR 0415 +ENCODING 1045 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0416 +ENCODING 1046 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 17 14 0 0 +BITMAP +E0C180 +F0C380 +30C600 +18C600 +18CC00 +0CDC00 +07F000 +0CDC00 +18CC00 +18C600 +30C700 +70C300 +60C380 +E0C180 +ENDCHAR +STARTCHAR 0417 +ENCODING 1047 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +3E00 +7F00 +E380 +C180 +0180 +0380 +0F00 +0F80 +0180 +00C0 +C0C0 +E180 +7F80 +3E00 +ENDCHAR +STARTCHAR 0418 +ENCODING 1048 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +C060 +C0E0 +C0E0 +C1A0 +C3A0 +C320 +C620 +CE20 +CC20 +D820 +D820 +F020 +E020 +E020 +ENDCHAR +STARTCHAR 0419 +ENCODING 1049 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +1100 +1900 +0E00 +0000 +C060 +C0E0 +C0E0 +C1A0 +C3A0 +C320 +C620 +CE20 +CC20 +D820 +D820 +F020 +E020 +E020 +ENDCHAR +STARTCHAR 041A +ENCODING 1050 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +C1C0 +C3C0 +C300 +C600 +C600 +CC00 +F800 +CC00 +C600 +C600 +C300 +C380 +C180 +C1C0 +ENDCHAR +STARTCHAR 041B +ENCODING 1051 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +3FE0 +3FE0 +3060 +3060 +3060 +3060 +3060 +3060 +3060 +3060 +3060 +B060 +F060 +6060 +ENDCHAR +STARTCHAR 041C +ENCODING 1052 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 14 1 0 +BITMAP +E018 +F038 +F028 +D028 +D868 +D868 +C848 +CCC8 +CCC8 +C488 +C788 +C788 +C308 +C308 +ENDCHAR +STARTCHAR 041D +ENCODING 1053 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 041E +ENCODING 1054 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 041F +ENCODING 1055 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +FFE0 +FFE0 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +ENDCHAR +STARTCHAR 0420 +ENCODING 1056 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF80 +FFC0 +C0E0 +C060 +C060 +C060 +C0C0 +FFC0 +FF80 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0421 +ENCODING 1057 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 0422 +ENCODING 1058 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0423 +ENCODING 1059 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 14 0 0 +BITMAP +C030 +6020 +6060 +3040 +10C0 +1880 +0980 +0D00 +0700 +0600 +0600 +0600 +3C00 +3800 +ENDCHAR +STARTCHAR 0424 +ENCODING 1060 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 1 0 +BITMAP +0600 +0600 +1FC0 +7FE0 +E670 +C630 +C618 +C618 +C630 +E670 +7FE0 +1FC0 +0600 +0600 +ENDCHAR +STARTCHAR 0425 +ENCODING 1061 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +6030 +3060 +30C0 +18C0 +0D80 +0F00 +0700 +0700 +0D80 +1980 +18C0 +3060 +6070 +E030 +ENDCHAR +STARTCHAR 0426 +ENCODING 1062 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +FFF0 +FFF0 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR 0427 +ENCODING 1063 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 14 1 0 +BITMAP +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +E1C0 +7FC0 +3EC0 +00C0 +00C0 +00C0 +00C0 +ENDCHAR +STARTCHAR 0428 +ENCODING 1064 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +FFFE +FFFE +ENDCHAR +STARTCHAR 0429 +ENCODING 1065 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 16 18 1 -4 +BITMAP +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +FFFF +FFFF +0001 +0001 +0001 +0001 +ENDCHAR +STARTCHAR 042A +ENCODING 1066 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 14 0 0 +BITMAP +FC00 +FC00 +0C00 +0C00 +0C00 +0C00 +0FF0 +0FFC +0C0C +0C0C +0C0C +0C0C +0FFC +0FF0 +ENDCHAR +STARTCHAR 042B +ENCODING 1067 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 13 14 2 0 +BITMAP +8018 +8018 +8018 +8018 +8018 +8018 +FF18 +FF98 +81D8 +80D8 +80D8 +81D8 +FF98 +FF18 +ENDCHAR +STARTCHAR 042C +ENCODING 1068 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 2 0 +BITMAP +8000 +8000 +8000 +8000 +8000 +8000 +FF00 +FF80 +81C0 +80C0 +80C0 +8180 +FF80 +FF00 +ENDCHAR +STARTCHAR 042D +ENCODING 1069 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +1F00 +7FC0 +60C0 +C060 +4060 +0030 +07F0 +07F0 +0030 +0020 +C060 +E0E0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 042E +ENCODING 1070 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 16 14 2 0 +BITMAP +80F8 +83FC +870E +8607 +8C03 +8C03 +FC03 +FC03 +8C03 +8C03 +8607 +870E +83FC +80F8 +ENDCHAR +STARTCHAR 042F +ENCODING 1071 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +3FE0 +7FE0 +6060 +C060 +C060 +6060 +7FE0 +3FE0 +1C60 +3860 +3060 +6060 +C060 +C060 +ENDCHAR +STARTCHAR 0430 +ENCODING 1072 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 0431 +ENCODING 1073 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3F80 +7F00 +E000 +C000 +9E00 +BF00 +E380 +C180 +C180 +C180 +C180 +6380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0432 +ENCODING 1074 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +FE +FF +C3 +C3 +FE +FF +C3 +C3 +FF +FE +ENDCHAR +STARTCHAR 0433 +ENCODING 1075 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +FC +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0434 +ENCODING 1076 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 -3 +BITMAP +1F80 +1F80 +3080 +3080 +3080 +3080 +2080 +6080 +FFE0 +FFE0 +8060 +8060 +8060 +ENDCHAR +STARTCHAR 0435 +ENCODING 1077 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0436 +ENCODING 1078 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 10 0 0 +BITMAP +E630 +E670 +3660 +16C0 +0F80 +16C0 +3660 +6620 +6630 +C610 +ENDCHAR +STARTCHAR 0437 +ENCODING 1079 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +78 +FC +C6 +06 +3C +3C +06 +86 +FE +7C +ENDCHAR +STARTCHAR 0438 +ENCODING 1080 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 10 1 0 +BITMAP +C3 +C3 +C7 +CD +C9 +D9 +D1 +F1 +E1 +C1 +ENDCHAR +STARTCHAR 0439 +ENCODING 1081 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +22 +22 +1C +00 +C3 +C3 +C7 +CD +C9 +D9 +D1 +F1 +E1 +C1 +ENDCHAR +STARTCHAR 043A +ENCODING 1082 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +C6 +CE +CC +D8 +F0 +D8 +CC +CC +C6 +C6 +ENDCHAR +STARTCHAR 043B +ENCODING 1083 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +3FC0 +3FC0 +30C0 +30C0 +30C0 +30C0 +30C0 +30C0 +F0C0 +E0C0 +ENDCHAR +STARTCHAR 043C +ENCODING 1084 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +E0E0 +E0E0 +F1E0 +D1E0 +D160 +DB60 +CA60 +CA60 +CE60 +C460 +ENDCHAR +STARTCHAR 043D +ENCODING 1085 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 10 1 0 +BITMAP +C1 +C1 +C1 +C1 +FF +FF +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 043E +ENCODING 1086 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 043F +ENCODING 1087 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +FF +FF +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR 0440 +ENCODING 1088 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DC00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0441 +ENCODING 1089 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 0442 +ENCODING 1090 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +FF +FF +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 0443 +ENCODING 1091 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0444 +ENCODING 1092 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 -4 +BITMAP +0300 +0300 +0300 +0300 +3BF0 +7FF8 +C71C +C30C +830C +830C +C30C +C718 +7FF8 +3BF0 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 0445 +ENCODING 1093 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +6180 +6300 +3600 +1E00 +0C00 +1C00 +1E00 +3300 +6300 +E180 +ENDCHAR +STARTCHAR 0446 +ENCODING 1094 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +C100 +C100 +C100 +C100 +C100 +C100 +C100 +C100 +FF80 +FF80 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 0447 +ENCODING 1095 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +83 +83 +83 +83 +C3 +FF +7F +03 +03 +03 +ENDCHAR +STARTCHAR 0448 +ENCODING 1096 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 10 1 0 +BITMAP +C218 +C218 +C218 +C218 +C218 +C218 +C218 +C218 +FFF8 +FFF8 +ENDCHAR +STARTCHAR 0449 +ENCODING 1097 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 -4 +BITMAP +C218 +C218 +C218 +C218 +C218 +C218 +C218 +C218 +FFFC +FFFC +0004 +0004 +0004 +0004 +ENDCHAR +STARTCHAR 044A +ENCODING 1098 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +F800 +F800 +1800 +1800 +1FC0 +1FE0 +1860 +1860 +1FE0 +1FC0 +ENDCHAR +STARTCHAR 044B +ENCODING 1099 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 10 1 0 +BITMAP +C020 +C020 +C020 +FE20 +FF20 +C320 +C120 +C320 +FF20 +FE20 +ENDCHAR +STARTCHAR 044C +ENCODING 1100 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C0 +C0 +C0 +FE +FF +C3 +C1 +C3 +FF +FE +ENDCHAR +STARTCHAR 044D +ENCODING 1101 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7C +FE +C7 +03 +1F +1F +03 +87 +FE +7C +ENDCHAR +STARTCHAR 044E +ENCODING 1102 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 10 1 0 +BITMAP +C3C0 +C7E0 +CE30 +CC10 +FC10 +FC10 +CC10 +CE30 +C7F0 +C3C0 +ENDCHAR +STARTCHAR 044F +ENCODING 1103 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7F +FF +C3 +C3 +7F +1F +73 +63 +C3 +C3 +ENDCHAR +STARTCHAR 0451 +ENCODING 1105 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2600 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0452 +ENCODING 1106 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 0 -4 +BITMAP +6000 +FC00 +FC00 +6000 +6F00 +7F80 +7180 +6080 +6080 +6080 +6080 +6080 +6080 +6080 +0080 +0180 +0380 +0300 +ENDCHAR +STARTCHAR 0453 +ENCODING 1107 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 14 1 0 +BITMAP +18 +18 +30 +00 +FC +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0454 +ENCODING 1108 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +7F +C3 +C0 +F8 +F8 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 0455 +ENCODING 1109 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 0456 +ENCODING 1110 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0457 +ENCODING 1111 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +C8 +C8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 0458 +ENCODING 1112 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 18 -1 -4 +BITMAP +30 +30 +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0459 +ENCODING 1113 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 17 10 0 0 +BITMAP +3FC000 +3FC000 +30C000 +30FE00 +30FF00 +30C300 +30C180 +30C300 +F0FF00 +E0FE00 +ENDCHAR +STARTCHAR 045A +ENCODING 1114 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 10 1 0 +BITMAP +C200 +C200 +C200 +C200 +FFF0 +FFF8 +C20C +C20C +C3F8 +C3F0 +ENDCHAR +STARTCHAR 045B +ENCODING 1115 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 0 0 +BITMAP +6000 +FC00 +FC00 +6000 +6F00 +7F80 +7180 +6080 +6080 +6080 +6080 +6080 +6080 +6080 +ENDCHAR +STARTCHAR 045C +ENCODING 1116 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 14 1 0 +BITMAP +18 +18 +30 +00 +C6 +CE +CC +D8 +F0 +D8 +CC +CC +C6 +C6 +ENDCHAR +STARTCHAR 045E +ENCODING 1118 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +46 +64 +38 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 045F +ENCODING 1119 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +FF +FF +08 +08 +08 +08 +ENDCHAR +STARTCHAR 0490 +ENCODING 1168 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 17 1 0 +BITMAP +03 +03 +03 +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0491 +ENCODING 1169 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +04 +04 +04 +04 +FC +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0492 +ENCODING 1170 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +7FC0 +7FC0 +6000 +6000 +6000 +6000 +FE00 +FE00 +6000 +6000 +6000 +6000 +6000 +6000 +ENDCHAR +STARTCHAR 0493 +ENCODING 1171 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7E +7E +60 +F8 +F8 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 0496 +ENCODING 1174 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 17 18 0 -4 +BITMAP +E0C380 +F0C780 +38C600 +18CE00 +1CCC00 +0FF800 +07F800 +0CDC00 +18CE00 +38C600 +30C700 +70C300 +60C380 +E0C180 +000080 +000080 +000080 +000080 +ENDCHAR +STARTCHAR 0497 +ENCODING 1175 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 13 0 -3 +BITMAP +E630 +E670 +3660 +1FC0 +1FC0 +36E0 +3660 +6630 +6638 +C618 +0018 +0018 +0018 +ENDCHAR +STARTCHAR 049A +ENCODING 1178 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 18 1 -4 +BITMAP +C1C0 +C3C0 +C700 +C600 +CE00 +FC00 +FC00 +CE00 +C600 +C700 +C300 +C380 +C1C0 +C1C0 +00C0 +00C0 +00C0 +00C0 +ENDCHAR +STARTCHAR 049B +ENCODING 1179 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 13 1 -3 +BITMAP +C6 +CE +D8 +F8 +F8 +D8 +CC +CC +C6 +C6 +02 +02 +02 +ENDCHAR +STARTCHAR 049C +ENCODING 1180 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +C1C0 +C3C0 +DF00 +DE00 +DE00 +FC00 +FC00 +DC00 +DE00 +DF00 +DB00 +DB80 +C180 +C1C0 +ENDCHAR +STARTCHAR 049D +ENCODING 1181 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +C6 +DE +D8 +F8 +F8 +D8 +DC +DC +C6 +C6 +ENDCHAR +STARTCHAR 04A2 +ENCODING 1186 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 2 -4 +BITMAP +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80E0 +80E0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR 04A3 +ENCODING 1187 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +C100 +C100 +C100 +C100 +FF00 +FF00 +C100 +C100 +C180 +C180 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 04AE +ENCODING 1198 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +C0C0 +60C0 +6180 +3180 +3300 +1A00 +0E00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 04AF +ENCODING 1199 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 -4 +BITMAP +C180 +6180 +6100 +6300 +3300 +3600 +1600 +1E00 +1C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 04B0 +ENCODING 1200 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +C0C0 +60C0 +2180 +3100 +1B00 +1E00 +7FC0 +7FC0 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 04B1 +ENCODING 1201 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 -4 +BITMAP +C180 +6180 +6100 +6300 +3300 +3600 +1600 +1E00 +1C00 +0C00 +7F80 +7F80 +0C00 +0C00 +ENDCHAR +STARTCHAR 04B2 +ENCODING 1202 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 -4 +BITMAP +6030 +3060 +38C0 +18C0 +0D80 +0F00 +0700 +0700 +0D80 +1DC0 +18C0 +3060 +6078 +E038 +0018 +0018 +0018 +0018 +ENDCHAR +STARTCHAR 04B3 +ENCODING 1203 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 0 -3 +BITMAP +6180 +7300 +3600 +1E00 +0C00 +1E00 +1E00 +3300 +6380 +E180 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 04B8 +ENCODING 1208 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 14 1 0 +BITMAP +C0C0 +C0C0 +C0C0 +CCC0 +CCC0 +CCC0 +EDC0 +7FC0 +3EC0 +0CC0 +0CC0 +0CC0 +00C0 +00C0 +ENDCHAR +STARTCHAR 04B9 +ENCODING 1209 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +83 +83 +93 +D3 +FF +7F +13 +13 +03 +03 +ENDCHAR +STARTCHAR 04BA +ENCODING 1210 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +DF80 +FFC0 +E0E0 +C060 +C060 +C060 +C060 +C060 +C060 +ENDCHAR +STARTCHAR 04BB +ENCODING 1211 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 04D8 +ENCODING 1240 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6030 +6030 +0030 +FFF0 +FFF0 +C010 +C030 +6030 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 04D9 +ENCODING 1241 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +FF00 +C300 +0180 +FF80 +FF80 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 04E8 +ENCODING 1256 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +FFF8 +FFF8 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 04E9 +ENCODING 1257 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +C300 +C180 +FF80 +FF80 +8180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 05B0 +ENCODING 1456 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 3 2 -4 +BITMAP +C0 +00 +C0 +ENDCHAR +STARTCHAR 05B1 +ENCODING 1457 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 -4 +BITMAP +FC +00 +6C +ENDCHAR +STARTCHAR 05B2 +ENCODING 1458 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 -4 +BITMAP +FC +00 +0C +ENDCHAR +STARTCHAR 05B3 +ENCODING 1459 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 -4 +BITMAP +FC +60 +0C +ENDCHAR +STARTCHAR 05B4 +ENCODING 1460 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 2 -3 +BITMAP +C0 +ENDCHAR +STARTCHAR 05B5 +ENCODING 1461 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 1 1 -3 +BITMAP +D0 +ENDCHAR +STARTCHAR 05B6 +ENCODING 1462 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 3 1 -4 +BITMAP +D0 +00 +60 +ENDCHAR +STARTCHAR 05B7 +ENCODING 1463 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 1 1 -3 +BITMAP +F0 +ENDCHAR +STARTCHAR 05B8 +ENCODING 1464 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 3 1 -4 +BITMAP +F0 +20 +20 +ENDCHAR +STARTCHAR 05B9 +ENCODING 1465 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 2 11 +BITMAP +C0 +ENDCHAR +STARTCHAR 05BA +ENCODING 1466 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 2 11 +BITMAP +C0 +ENDCHAR +STARTCHAR 05BB +ENCODING 1467 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 -4 +BITMAP +C0 +30 +04 +ENDCHAR +STARTCHAR 05BC +ENCODING 1468 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 2 5 +BITMAP +C0 +ENDCHAR +STARTCHAR 05BD +ENCODING 1469 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 1 3 3 -4 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR 05BE +ENCODING 1470 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 2 1 8 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR 05BF +ENCODING 1471 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 1 1 12 +BITMAP +F0 +ENDCHAR +STARTCHAR 05C0 +ENCODING 1472 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 1 12 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 05C1 +ENCODING 1473 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 7 12 +BITMAP +C0 +ENDCHAR +STARTCHAR 05C2 +ENCODING 1474 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 1 1 -2 12 +BITMAP +80 +ENDCHAR +STARTCHAR 05C3 +ENCODING 1475 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 10 2 0 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR 05D0 +ENCODING 1488 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +E180 +6100 +3300 +3B00 +7F00 +4E00 +C600 +C600 +C300 +C180 +ENDCHAR +STARTCHAR 05D1 +ENCODING 1489 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 10 0 0 +BITMAP +7C00 +7E00 +0700 +0300 +0100 +0100 +0100 +0100 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 05D2 +ENCODING 1490 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +78 +7C +0C +0C +0C +1C +3C +64 +66 +C6 +ENDCHAR +STARTCHAR 05D3 +ENCODING 1491 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +FF80 +FF80 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 05D4 +ENCODING 1492 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +FE00 +7F00 +0380 +0180 +C180 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR 05D5 +ENCODING 1493 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 05D6 +ENCODING 1494 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +FC +FC +30 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 05D7 +ENCODING 1495 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +FE00 +FF00 +C380 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR 05D8 +ENCODING 1496 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +C700 +CF80 +C980 +C180 +C180 +C180 +C180 +6380 +7F00 +1E00 +ENDCHAR +STARTCHAR 05D9 +ENCODING 1497 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 5 1 5 +BITMAP +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 05DA +ENCODING 1498 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 -4 +BITMAP +FC +FE +07 +03 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 05DB +ENCODING 1499 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +F0 +FC +0C +06 +06 +06 +06 +0C +FC +F0 +ENDCHAR +STARTCHAR 05DC +ENCODING 1500 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +80 +80 +80 +80 +FE +FE +06 +06 +04 +0C +18 +18 +18 +18 +ENDCHAR +STARTCHAR 05DD +ENCODING 1501 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +FE00 +FF00 +C380 +C180 +C180 +C180 +C180 +C180 +FF80 +FF80 +ENDCHAR +STARTCHAR 05DE +ENCODING 1502 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +CE00 +DF00 +7180 +6180 +6180 +6180 +4180 +4180 +CF80 +CF80 +ENDCHAR +STARTCHAR 05DF +ENCODING 1503 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 1 -4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 05E0 +ENCODING 1504 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +E0 +F0 +30 +10 +10 +10 +10 +10 +F0 +F0 +ENDCHAR +STARTCHAR 05E1 +ENCODING 1505 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +E380 +C180 +C180 +C180 +C180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR 05E2 +ENCODING 1506 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 11 0 -1 +BITMAP +6180 +2180 +3180 +3180 +3180 +3180 +1300 +1700 +1E00 +FC00 +E000 +ENDCHAR +STARTCHAR 05E3 +ENCODING 1507 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +FC +FF +C3 +C3 +C1 +C1 +71 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 05E4 +ENCODING 1508 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 1 0 +BITMAP +FC00 +FE00 +C700 +C300 +C180 +7180 +0300 +8700 +FE00 +7C00 +ENDCHAR +STARTCHAR 05E5 +ENCODING 1509 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 0 -4 +BITMAP +C3 +63 +23 +33 +16 +1C +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 05E6 +ENCODING 1510 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +C3 +63 +33 +33 +1E +0C +04 +06 +7F +7F +ENDCHAR +STARTCHAR 05E7 +ENCODING 1511 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +FF +FF +01 +01 +43 +43 +46 +44 +44 +44 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 05E8 +ENCODING 1512 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 0 0 +BITMAP +FC +FE +07 +03 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 05E9 +ENCODING 1513 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +C460 +C460 +C460 +CC60 +CC60 +F860 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR 05EA +ENCODING 1514 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +7F80 +7FC0 +18E0 +1860 +1860 +1860 +1860 +1860 +7860 +F060 +ENDCHAR +STARTCHAR 05F0 +ENCODING 1520 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR 05F1 +ENCODING 1521 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +06 +06 +ENDCHAR +STARTCHAR 05F2 +ENCODING 1522 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 5 1 5 +BITMAP +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR 05F3 +ENCODING 1523 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 4 1 6 +BITMAP +40 +C0 +C0 +80 +ENDCHAR +STARTCHAR 05F4 +ENCODING 1524 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 4 1 6 +BITMAP +4C +C8 +C8 +98 +ENDCHAR +STARTCHAR 060C +ENCODING 1548 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 6 2 3 +BITMAP +40 +80 +80 +C0 +E0 +C0 +ENDCHAR +STARTCHAR 061B +ENCODING 1563 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 9 1 3 +BITMAP +20 +40 +80 +E0 +60 +60 +00 +60 +60 +ENDCHAR +STARTCHAR 061F +ENCODING 1567 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 11 1 3 +BITMAP +70 +C8 +98 +D8 +C0 +60 +20 +20 +00 +60 +60 +ENDCHAR +STARTCHAR 0621 +ENCODING 1569 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 8 1 1 +BITMAP +30 +70 +40 +CC +FC +70 +60 +40 +ENDCHAR +STARTCHAR 0622 +ENCODING 1570 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 14 0 2 +BITMAP +F0 +00 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0623 +ENCODING 1571 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 2 +BITMAP +40 +80 +C0 +80 +00 +00 +80 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 0624 +ENCODING 1572 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +10 +0C +10 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 0625 +ENCODING 1573 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 16 0 -2 +BITMAP +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +60 +80 +60 +80 +ENDCHAR +STARTCHAR 0626 +ENCODING 1574 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 12 0 -1 +BITMAP +2000 +4000 +6060 +40F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0627 +ENCODING 1575 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 11 1 3 +BITMAP +80 +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 0628 +ENCODING 1576 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 0 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 0629 +ENCODING 1577 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 11 0 3 +BITMAP +10 +D0 +C0 +00 +20 +30 +78 +48 +48 +78 +70 +ENDCHAR +STARTCHAR 062A +ENCODING 1578 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 3 +BITMAP +0300 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 062B +ENCODING 1579 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 10 1 3 +BITMAP +0400 +0700 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 062C +ENCODING 1580 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8600 +8600 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 062D +ENCODING 1581 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 062E +ENCODING 1582 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0400 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 062F +ENCODING 1583 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 8 1 3 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 0630 +ENCODING 1584 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +40 +60 +00 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 0631 +ENCODING 1585 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 1 -2 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0632 +ENCODING 1586 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -2 +BITMAP +04 +04 +00 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0633 +ENCODING 1587 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 9 1 -1 +BITMAP +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR 0634 +ENCODING 1588 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 -1 +BITMAP +0030 +0038 +0028 +0020 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR 0635 +ENCODING 1589 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 9 1 -1 +BITMAP +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR 0636 +ENCODING 1590 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 12 1 -1 +BITMAP +000800 +000800 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR 0637 +ENCODING 1591 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 0638 +ENCODING 1592 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 0639 +ENCODING 1593 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 0 -4 +BITMAP +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR 063A +ENCODING 1594 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 20 0 -4 +BITMAP +1000 +1000 +0000 +0000 +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR 0640 +ENCODING 1600 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 2 -1 3 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR 0641 +ENCODING 1601 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 10 0 3 +BITMAP +0018 +0018 +0000 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR 0642 +ENCODING 1602 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -1 +BITMAP +0100 +0580 +0400 +0000 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR 0643 +ENCODING 1603 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 12 0 3 +BITMAP +0040 +0060 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR 0644 +ENCODING 1604 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 0 +BITMAP +0200 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR 0645 +ENCODING 1605 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 11 0 -4 +BITMAP +38 +3C +0C +3C +7C +C0 +80 +80 +40 +40 +40 +ENDCHAR +STARTCHAR 0646 +ENCODING 1606 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 -1 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR 0647 +ENCODING 1607 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 7 1 3 +BITMAP +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR 0648 +ENCODING 1608 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 0649 +ENCODING 1609 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 064A +ENCODING 1610 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0300 +0B00 +0800 +ENDCHAR +STARTCHAR 064B +ENCODING 1611 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 4 1 12 +BITMAP +60 +80 +60 +80 +ENDCHAR +STARTCHAR 064C +ENCODING 1612 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 3 5 1 12 +BITMAP +20 +60 +A0 +E0 +C0 +ENDCHAR +STARTCHAR 064D +ENCODING 1613 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 4 1 -3 +BITMAP +60 +80 +60 +80 +ENDCHAR +STARTCHAR 064E +ENCODING 1614 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 2 1 12 +BITMAP +60 +80 +ENDCHAR +STARTCHAR 064F +ENCODING 1615 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 5 1 12 +BITMAP +60 +60 +60 +60 +80 +ENDCHAR +STARTCHAR 0650 +ENCODING 1616 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 2 1 0 +BITMAP +60 +80 +ENDCHAR +STARTCHAR 0651 +ENCODING 1617 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 3 1 12 +BITMAP +40 +60 +80 +ENDCHAR +STARTCHAR 0652 +ENCODING 1618 +SWIDTH 154 0 +DWIDTH 3 0 +BBX 2 3 1 12 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0653 +ENCODING 1619 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 2 0 13 +BITMAP +C0 +70 +ENDCHAR +STARTCHAR 0654 +ENCODING 1620 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 4 1 13 +BITMAP +40 +80 +C0 +80 +ENDCHAR +STARTCHAR 0655 +ENCODING 1621 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 4 1 -3 +BITMAP +40 +80 +C0 +80 +ENDCHAR +STARTCHAR 0660 +ENCODING 1632 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 3 4 4 4 +BITMAP +80 +E0 +C0 +40 +ENDCHAR +STARTCHAR 0661 +ENCODING 1633 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 3 10 3 3 +BITMAP +80 +C0 +C0 +60 +60 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0662 +ENCODING 1634 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 5 11 2 3 +BITMAP +80 +C8 +F8 +78 +60 +20 +30 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 0663 +ENCODING 1635 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 4 +BITMAP +CD +7F +76 +20 +20 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 0664 +ENCODING 1636 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 4 11 3 3 +BITMAP +10 +20 +40 +80 +F0 +60 +40 +40 +C0 +F0 +70 +ENDCHAR +STARTCHAR 0665 +ENCODING 1637 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 8 2 5 +BITMAP +30 +78 +9C +84 +84 +84 +F8 +F0 +ENDCHAR +STARTCHAR 0666 +ENCODING 1638 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 11 2 3 +BITMAP +80 +F0 +F0 +10 +10 +10 +10 +18 +08 +0C +04 +ENDCHAR +STARTCHAR 0667 +ENCODING 1639 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 3 +BITMAP +81 +C1 +C3 +62 +24 +24 +18 +18 +18 +08 +ENDCHAR +STARTCHAR 0668 +ENCODING 1640 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 4 +BITMAP +10 +18 +28 +28 +24 +26 +46 +C3 +81 +81 +ENDCHAR +STARTCHAR 0669 +ENCODING 1641 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 11 2 3 +BITMAP +30 +70 +98 +88 +F8 +78 +08 +08 +08 +0C +08 +ENDCHAR +STARTCHAR 066A +ENCODING 1642 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 13 1 2 +BITMAP +63 +62 +06 +04 +0C +08 +18 +10 +30 +20 +60 +46 +C6 +ENDCHAR +STARTCHAR 066B +ENCODING 1643 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 5 2 1 +BITMAP +C0 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR 066C +ENCODING 1644 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 6 2 3 +BITMAP +40 +80 +80 +C0 +E0 +C0 +ENDCHAR +STARTCHAR 066D +ENCODING 1645 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 7 2 7 +BITMAP +20 +E8 +50 +FC +70 +E8 +20 +ENDCHAR +STARTCHAR 066E +ENCODING 1646 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 6 1 3 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 066F +ENCODING 1647 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 9 1 -1 +BITMAP +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR 0670 +ENCODING 1648 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 4 0 11 +BITMAP +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0671 +ENCODING 1649 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 15 0 2 +BITMAP +30 +F0 +80 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0672 +ENCODING 1650 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 15 0 2 +BITMAP +20 +40 +E0 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0673 +ENCODING 1651 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 15 0 -1 +BITMAP +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +20 +40 +E0 +ENDCHAR +STARTCHAR 0674 +ENCODING 1652 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 4 1 13 +BITMAP +40 +80 +C0 +80 +ENDCHAR +STARTCHAR 0675 +ENCODING 1653 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 12 1 2 +BITMAP +10 +A0 +D0 +60 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 0676 +ENCODING 1654 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 9 16 0 -2 +BITMAP +0080 +0100 +0080 +0100 +0000 +0300 +0700 +0500 +0500 +0700 +0300 +0100 +0100 +0200 +8600 +7C00 +ENDCHAR +STARTCHAR 0677 +ENCODING 1655 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 9 16 0 -2 +BITMAP +0C80 +0D00 +0C80 +0D00 +1000 +0300 +0700 +0500 +0500 +0700 +0300 +0100 +0100 +0200 +8600 +7C00 +ENDCHAR +STARTCHAR 0678 +ENCODING 1656 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 15 0 -1 +BITMAP +0010 +0020 +0010 +0020 +0000 +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0679 +ENCODING 1657 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 13 1 3 +BITMAP +0400 +0800 +0400 +0780 +0480 +1F80 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 067A +ENCODING 1658 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0400 +0400 +0600 +0200 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 067B +ENCODING 1659 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0200 +0200 +0200 +0200 +ENDCHAR +STARTCHAR 067C +ENCODING 1660 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 1 +BITMAP +0300 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0500 +0600 +ENDCHAR +STARTCHAR 067D +ENCODING 1661 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0300 +0F00 +0E00 +0200 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 067E +ENCODING 1662 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0100 +0500 +0700 +0300 +ENDCHAR +STARTCHAR 067F +ENCODING 1663 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0200 +0A00 +0900 +0D00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 0680 +ENCODING 1664 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 12 1 -3 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0300 +0D00 +0D00 +0500 +0400 +ENDCHAR +STARTCHAR 0681 +ENCODING 1665 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 0 -4 +BITMAP +0600 +0800 +0600 +0800 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0682 +ENCODING 1666 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 0 -4 +BITMAP +0C00 +0C00 +0400 +0400 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0683 +ENCODING 1667 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8300 +8B00 +8800 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0684 +ENCODING 1668 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8400 +8400 +8600 +4600 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0685 +ENCODING 1669 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 0 -4 +BITMAP +0800 +0A00 +0A00 +0800 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0686 +ENCODING 1670 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4200 +8B00 +8A00 +8200 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0687 +ENCODING 1671 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4300 +8B00 +8D00 +8500 +4400 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0688 +ENCODING 1672 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 15 0 3 +BITMAP +20 +20 +20 +2C +34 +FC +00 +10 +18 +0C +04 +04 +04 +7C +7C +ENDCHAR +STARTCHAR 0689 +ENCODING 1673 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 10 1 1 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +50 +30 +ENDCHAR +STARTCHAR 068A +ENCODING 1674 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 11 1 0 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +00 +20 +30 +ENDCHAR +STARTCHAR 068B +ENCODING 1675 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 18 0 0 +BITMAP +20 +20 +20 +2C +34 +FC +00 +10 +18 +0C +04 +04 +04 +7C +7C +00 +10 +18 +ENDCHAR +STARTCHAR 068C +ENCODING 1676 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +30 +D0 +C0 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 068D +ENCODING 1677 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 -1 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +00 +10 +50 +40 +ENDCHAR +STARTCHAR 068E +ENCODING 1678 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 13 1 3 +BITMAP +40 +50 +50 +40 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 068F +ENCODING 1679 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 13 1 3 +BITMAP +20 +A0 +A0 +20 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 0690 +ENCODING 1680 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 14 1 3 +BITMAP +30 +B0 +90 +50 +40 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 0691 +ENCODING 1681 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 17 1 -2 +BITMAP +08 +10 +08 +0F +09 +3F +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0692 +ENCODING 1682 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 13 1 -2 +BITMAP +0A +04 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0693 +ENCODING 1683 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8F +7D +03 +ENDCHAR +STARTCHAR 0694 +ENCODING 1684 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +79 +01 +ENDCHAR +STARTCHAR 0695 +ENCODING 1685 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 12 1 -4 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +05 +02 +ENDCHAR +STARTCHAR 0696 +ENCODING 1686 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +02 +03 +01 +01 +11 +11 +01 +03 +8E +79 +01 +ENDCHAR +STARTCHAR 0697 +ENCODING 1687 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -2 +BITMAP +06 +1E +18 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0698 +ENCODING 1688 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 15 1 -2 +BITMAP +0C +0F +0B +08 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0699 +ENCODING 1689 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 16 1 -2 +BITMAP +04 +14 +16 +1A +18 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 069A +ENCODING 1690 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 12 1 -1 +BITMAP +0020 +0030 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8188 +FF08 +7C00 +ENDCHAR +STARTCHAR 069B +ENCODING 1691 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 10 1 -2 +BITMAP +0104 +0182 +0092 +80FE +80FE +8080 +8184 +FF14 +7C14 +0004 +ENDCHAR +STARTCHAR 069C +ENCODING 1692 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 15 1 -2 +BITMAP +0060 +0070 +0050 +0040 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8184 +FF14 +7C14 +0004 +ENDCHAR +STARTCHAR 069D +ENCODING 1693 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 9 1 -1 +BITMAP +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810100 +FF0500 +7C0400 +ENDCHAR +STARTCHAR 069E +ENCODING 1694 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 14 1 -1 +BITMAP +000400 +000500 +000500 +000400 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR 069F +ENCODING 1695 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1880 +18E0 +09E0 +0980 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 06A0 +ENCODING 1696 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 21 0 -4 +BITMAP +2000 +2800 +2800 +2000 +0000 +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR 06A1 +ENCODING 1697 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 6 0 3 +BITMAP +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR 06A2 +ENCODING 1698 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 9 0 0 +BITMAP +400C +800E +801A +C00E +7FFE +3FFE +0000 +0004 +0004 +ENDCHAR +STARTCHAR 06A3 +ENCODING 1699 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 12 0 0 +BITMAP +0008 +0008 +0000 +400C +800E +801A +C00E +7FFE +3FFE +0000 +0180 +0080 +ENDCHAR +STARTCHAR 06A4 +ENCODING 1700 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0010 +001C +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR 06A5 +ENCODING 1701 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 -2 +BITMAP +400C +800E +801A +C00E +7FFE +3FFE +0000 +0002 +000A +000A +0002 +ENDCHAR +STARTCHAR 06A6 +ENCODING 1702 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 12 0 3 +BITMAP +0004 +0014 +0014 +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR 06A7 +ENCODING 1703 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 13 1 -1 +BITMAP +0300 +0300 +0000 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR 06A8 +ENCODING 1704 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -1 +BITMAP +0400 +0700 +0500 +0400 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR 06A9 +ENCODING 1705 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0006 +001E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06AA +ENCODING 1706 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 10 0 3 +BITMAP +0080 +0380 +0E00 +1000 +1F00 +8FF8 +80FE +C002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06AB +ENCODING 1707 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0006 +001E +007A +004C +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06AC +ENCODING 1708 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 12 0 3 +BITMAP +0640 +0660 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR 06AD +ENCODING 1709 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 3 +BITMAP +0C00 +0E40 +0B60 +0860 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR 06AE +ENCODING 1710 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 17 0 -2 +BITMAP +0040 +0060 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +0000 +0300 +0F00 +0E00 +0200 +ENDCHAR +STARTCHAR 06AF +ENCODING 1711 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06B0 +ENCODING 1712 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0002 +000E +0038 +0066 +009E +007A +004C +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06B1 +ENCODING 1713 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0012 +004E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06B2 +ENCODING 1714 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 18 0 -1 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +0000 +0040 +0140 +0100 +ENDCHAR +STARTCHAR 06B3 +ENCODING 1715 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 19 0 -2 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +0000 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 06B4 +ENCODING 1716 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0042 +001E +0078 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06B5 +ENCODING 1717 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 17 1 0 +BITMAP +0500 +0200 +0000 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR 06B6 +ENCODING 1718 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 17 1 0 +BITMAP +0300 +0300 +0000 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR 06B7 +ENCODING 1719 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 17 1 0 +BITMAP +0600 +0100 +0400 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR 06B8 +ENCODING 1720 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 19 1 -4 +BITMAP +0200 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +0400 +2C00 +3C00 +0C00 +ENDCHAR +STARTCHAR 06B9 +ENCODING 1721 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 -4 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +0000 +0800 +0800 +ENDCHAR +STARTCHAR 06BA +ENCODING 1722 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR 06BB +ENCODING 1723 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 1 -1 +BITMAP +1000 +1000 +1000 +1600 +1A00 +3E00 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR 06BC +ENCODING 1724 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 1 -3 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +2800 +1800 +ENDCHAR +STARTCHAR 06BD +ENCODING 1725 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 1 -1 +BITMAP +1000 +1400 +3400 +1000 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR 06BE +ENCODING 1726 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 8 -1 3 +BITMAP +08 +1C +1C +26 +27 +19 +FF +E7 +ENDCHAR +STARTCHAR 06BF +ENCODING 1727 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0400 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4200 +8B00 +8A00 +8200 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 06C0 +ENCODING 1728 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 12 1 3 +BITMAP +60 +80 +60 +80 +00 +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR 06C1 +ENCODING 1729 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +18 +3C +6E +46 +80 +ENDCHAR +STARTCHAR 06C2 +ENCODING 1730 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 10 0 2 +BITMAP +10 +20 +10 +20 +00 +18 +3C +6E +46 +80 +ENDCHAR +STARTCHAR 06C3 +ENCODING 1731 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 9 0 2 +BITMAP +08 +28 +20 +00 +18 +3C +6E +46 +80 +ENDCHAR +STARTCHAR 06C4 +ENCODING 1732 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +01 +0D +16 +8E +7C +ENDCHAR +STARTCHAR 06C5 +ENCODING 1733 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +19 +07 +02 +86 +7C +ENDCHAR +STARTCHAR 06C6 +ENCODING 1734 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +05 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06C7 +ENCODING 1735 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -2 +BITMAP +03 +03 +03 +03 +04 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06C8 +ENCODING 1736 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -1 +BITMAP +02 +02 +02 +02 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06C9 +ENCODING 1737 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +02 +05 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06CA +ENCODING 1738 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 15 0 -2 +BITMAP +03 +0F +0C +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06CB +ENCODING 1739 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +04 +07 +0D +0C +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06CC +ENCODING 1740 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 06CD +ENCODING 1741 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 13 10 -1 -1 +BITMAP +0030 +0078 +0080 +2100 +E1F0 +40F0 +4010 +60E0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 06CE +ENCODING 1742 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 11 0 -1 +BITMAP +0C00 +0860 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 06CF +ENCODING 1743 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +04 +04 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06D0 +ENCODING 1744 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0000 +0400 +0400 +ENDCHAR +STARTCHAR 06D1 +ENCODING 1745 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0000 +0A00 +0600 +ENDCHAR +STARTCHAR 06D2 +ENCODING 1746 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 7 1 0 +BITMAP +0600 +0E00 +3800 +7000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR 06D3 +ENCODING 1747 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 10 1 0 +BITMAP +0800 +3000 +1800 +2600 +0E00 +3800 +7000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR 06D4 +ENCODING 1748 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 2 0 3 +BITMAP +F0 +F0 +ENDCHAR +STARTCHAR 06D5 +ENCODING 1749 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 7 1 3 +BITMAP +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR 06D6 +ENCODING 1750 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 7 -4 10 +BITMAP +20 +20 +20 +23 +7F +80 +FE +ENDCHAR +STARTCHAR 06D7 +ENCODING 1751 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 7 -3 10 +BITMAP +28 +30 +38 +24 +7C +80 +FE +ENDCHAR +STARTCHAR 06D8 +ENCODING 1752 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -2 10 +BITMAP +20 +50 +F0 +ENDCHAR +STARTCHAR 06D9 +ENCODING 1753 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 6 -2 10 +BITMAP +90 +D0 +50 +20 +60 +60 +ENDCHAR +STARTCHAR 06DA +ENCODING 1754 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 5 -2 10 +BITMAP +F0 +80 +A0 +80 +F0 +ENDCHAR +STARTCHAR 06DB +ENCODING 1755 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -1 10 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR 06DC +ENCODING 1756 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 5 -4 10 +BITMAP +08 +09 +87 +88 +70 +ENDCHAR +STARTCHAR 06DD +ENCODING 1757 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 21 21 0 -4 +BITMAP +00FC00 +0F0380 +13FE80 +1C01C0 +100060 +200020 +400010 +400010 +400008 +400008 +800008 +400008 +400008 +400010 +400010 +200020 +100060 +1C01C0 +13FE80 +0F0380 +00FC00 +ENDCHAR +STARTCHAR 06DE +ENCODING 1758 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 21 0 -4 +BITMAP +002000 +005000 +008800 +1FFF80 +120480 +140280 +180180 +100080 +307040 +5090A0 +909090 +5090A0 +307040 +100080 +180180 +140280 +120480 +1FFF80 +008800 +005000 +002000 +ENDCHAR +STARTCHAR 06DF +ENCODING 1759 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 1 -1 10 +BITMAP +C0 +ENDCHAR +STARTCHAR 06E0 +ENCODING 1760 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 1 -1 10 +BITMAP +C0 +ENDCHAR +STARTCHAR 06E1 +ENCODING 1761 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 3 -3 10 +BITMAP +30 +18 +FC +ENDCHAR +STARTCHAR 06E2 +ENCODING 1762 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 5 -1 10 +BITMAP +40 +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR 06E3 +ENCODING 1763 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 5 -4 -4 +BITMAP +08 +09 +87 +88 +70 +ENDCHAR +STARTCHAR 06E4 +ENCODING 1764 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 1 -1 10 +BITMAP +C0 +ENDCHAR +STARTCHAR 06E5 +ENCODING 1765 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 4 1 10 +BITMAP +60 +60 +40 +C0 +ENDCHAR +STARTCHAR 06E6 +ENCODING 1766 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 4 0 10 +BITMAP +10 +70 +80 +FE +ENDCHAR +STARTCHAR 06E7 +ENCODING 1767 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 4 -4 10 +BITMAP +10 +20 +C0 +FE +ENDCHAR +STARTCHAR 06E8 +ENCODING 1768 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 6 -2 10 +BITMAP +20 +00 +10 +90 +90 +F0 +ENDCHAR +STARTCHAR 06E9 +ENCODING 1769 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 16 1 0 +BITMAP +0800 +1400 +2A00 +5580 +AA40 +D780 +7700 +5300 +5300 +5300 +5300 +5F00 +6300 +9E80 +8080 +FFC0 +ENDCHAR +STARTCHAR 06EA +ENCODING 1770 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -2 -3 +BITMAP +60 +90 +60 +ENDCHAR +STARTCHAR 06EB +ENCODING 1771 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -2 10 +BITMAP +60 +90 +60 +ENDCHAR +STARTCHAR 06EC +ENCODING 1772 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 1 -1 10 +BITMAP +C0 +ENDCHAR +STARTCHAR 06ED +ENCODING 1773 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 5 -1 -4 +BITMAP +40 +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR 06F0 +ENCODING 1776 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 3 4 4 4 +BITMAP +80 +E0 +C0 +40 +ENDCHAR +STARTCHAR 06F1 +ENCODING 1777 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 3 10 3 3 +BITMAP +80 +C0 +C0 +60 +60 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 06F2 +ENCODING 1778 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 5 11 2 3 +BITMAP +80 +C8 +F8 +78 +60 +20 +30 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 06F3 +ENCODING 1779 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 4 +BITMAP +CD +7F +76 +20 +20 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 06F4 +ENCODING 1780 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 10 2 3 +BITMAP +1C +A0 +E2 +FC +78 +60 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 06F5 +ENCODING 1781 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 11 1 3 +BITMAP +10 +18 +1C +1C +26 +42 +42 +42 +CA +FE +7C +ENDCHAR +STARTCHAR 06F6 +ENCODING 1782 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 11 2 3 +BITMAP +30 +78 +80 +84 +FC +F8 +30 +20 +40 +40 +40 +ENDCHAR +STARTCHAR 06F7 +ENCODING 1783 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 3 +BITMAP +81 +C1 +C3 +62 +24 +24 +18 +18 +18 +08 +ENDCHAR +STARTCHAR 06F8 +ENCODING 1784 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 4 +BITMAP +10 +18 +28 +28 +24 +26 +46 +C3 +81 +81 +ENDCHAR +STARTCHAR 06F9 +ENCODING 1785 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 11 2 3 +BITMAP +30 +70 +98 +88 +F8 +78 +08 +08 +08 +0C +08 +ENDCHAR +STARTCHAR 06FA +ENCODING 1786 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 -1 +BITMAP +0060 +0070 +0050 +0040 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8188 +FF08 +7C00 +ENDCHAR +STARTCHAR 06FB +ENCODING 1787 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 12 1 -1 +BITMAP +000800 +000800 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810200 +FF0200 +7C0000 +ENDCHAR +STARTCHAR 06FC +ENCODING 1788 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 20 0 -4 +BITMAP +1000 +1000 +0000 +0000 +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8200 +8200 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR 06FD +ENCODING 1789 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +30 +70 +40 +CC +FC +70 +60 +40 +28 +28 +28 +28 +ENDCHAR +STARTCHAR 06FE +ENCODING 1790 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 11 0 -4 +BITMAP +38 +3C +0C +3C +7C +C0 +80 +94 +54 +54 +54 +ENDCHAR +STARTCHAR 1E80 +ENCODING 7808 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 18 0 0 +BITMAP +018000 +00C000 +004000 +000000 +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 1E81 +ENCODING 7809 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +0600 +0600 +0200 +0000 +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 1E82 +ENCODING 7810 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 18 0 0 +BITMAP +006000 +004000 +00C000 +000000 +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 1E83 +ENCODING 7811 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +0300 +0300 +0200 +0000 +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 1E84 +ENCODING 7812 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 17 0 0 +BITMAP +033000 +033000 +000000 +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 1E85 +ENCODING 7813 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 13 0 0 +BITMAP +0CC0 +0CC0 +0000 +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 1EA0 +ENCODING 7840 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 17 0 -3 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EA1 +ENCODING 7841 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EA2 +ENCODING 7842 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0F00 +0100 +0300 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EA3 +ENCODING 7843 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EA4 +ENCODING 7844 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0300 +0200 +0700 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EA5 +ENCODING 7845 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EA6 +ENCODING 7846 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0C00 +0600 +0700 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EA7 +ENCODING 7847 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1000 +1800 +0000 +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EA8 +ENCODING 7848 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0700 +0300 +0700 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EA9 +ENCODING 7849 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3C00 +0400 +0C00 +0000 +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EAA +ENCODING 7850 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0C80 +1380 +0700 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EAB +ENCODING 7851 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3200 +4E00 +0000 +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EAC +ENCODING 7852 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 20 0 -3 +BITMAP +0700 +0900 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EAD +ENCODING 7853 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EAE +ENCODING 7854 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0300 +0200 +0880 +0700 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EAF +ENCODING 7855 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +1800 +0000 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EB0 +ENCODING 7856 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0C00 +0600 +0880 +0700 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EB1 +ENCODING 7857 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1800 +0800 +0000 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EB2 +ENCODING 7858 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0700 +0300 +0880 +0700 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EB3 +ENCODING 7859 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EB4 +ENCODING 7860 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0E80 +1380 +0880 +0700 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EB5 +ENCODING 7861 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3B00 +2600 +0000 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EB6 +ENCODING 7862 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 20 0 -3 +BITMAP +0880 +0700 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EB7 +ENCODING 7863 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EB8 +ENCODING 7864 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 17 1 -3 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EB9 +ENCODING 7865 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EBA +ENCODING 7866 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +0300 +0600 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EBB +ENCODING 7867 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EBC +ENCODING 7868 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1C80 +1F80 +1300 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EBD +ENCODING 7869 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3A00 +3E00 +6E00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EBE +ENCODING 7870 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0600 +0400 +0E00 +1B00 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EBF +ENCODING 7871 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EC0 +ENCODING 7872 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0800 +0400 +0E00 +1B00 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EC1 +ENCODING 7873 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1000 +1800 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EC2 +ENCODING 7874 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +0600 +0E00 +1B00 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EC3 +ENCODING 7875 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3C00 +0400 +0C00 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EC4 +ENCODING 7876 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1D00 +2700 +0E00 +1B00 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EC5 +ENCODING 7877 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3200 +4E00 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EC6 +ENCODING 7878 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 20 1 -3 +BITMAP +0E00 +1B00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EC7 +ENCODING 7879 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EC8 +ENCODING 7880 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 18 1 0 +BITMAP +E0 +30 +70 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 1EC9 +ENCODING 7881 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 14 0 0 +BITMAP +F0 +10 +30 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 1ECA +ENCODING 7882 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 17 2 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR 1ECB +ENCODING 7883 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 17 1 -3 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR 1ECC +ENCODING 7884 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 17 1 -3 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1ECD +ENCODING 7885 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1ECE +ENCODING 7886 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0700 +0180 +0300 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ECF +ENCODING 7887 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED0 +ENCODING 7888 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0300 +0200 +0700 +0D80 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ED1 +ENCODING 7889 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED2 +ENCODING 7890 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0400 +0200 +0700 +0D80 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ED3 +ENCODING 7891 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1000 +1800 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED4 +ENCODING 7892 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0700 +0300 +0700 +0D80 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ED5 +ENCODING 7893 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3C00 +0400 +0C00 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED6 +ENCODING 7894 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0E40 +1380 +0700 +0D80 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ED7 +ENCODING 7895 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3200 +4E00 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED8 +ENCODING 7896 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 20 1 -3 +BITMAP +0700 +0D80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1ED9 +ENCODING 7897 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EDA +ENCODING 7898 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0300 +0300 +0600 +0000 +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1EDB +ENCODING 7899 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EDC +ENCODING 7900 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0C00 +0600 +0200 +0000 +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1EDD +ENCODING 7901 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +3000 +1800 +0800 +0000 +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EDE +ENCODING 7902 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0700 +0180 +0300 +0000 +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1EDF +ENCODING 7903 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EE0 +ENCODING 7904 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0EC0 +0F80 +1B80 +0000 +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1EE1 +ENCODING 7905 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +3200 +7E00 +4E00 +0000 +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EE2 +ENCODING 7906 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 17 1 -3 +BITMAP +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EE3 +ENCODING 7907 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 13 1 -3 +BITMAP +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EE4 +ENCODING 7908 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 17 1 -3 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EE5 +ENCODING 7909 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 13 1 -3 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +00 +18 +18 +ENDCHAR +STARTCHAR 1EE6 +ENCODING 7910 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0E00 +0300 +0700 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EE7 +ENCODING 7911 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +3C +04 +0C +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 1EE8 +ENCODING 7912 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0300 +0600 +0400 +0000 +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EE9 +ENCODING 7913 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +0C00 +0C00 +1800 +0000 +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 1EEA +ENCODING 7914 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0C00 +0400 +0600 +0000 +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EEB +ENCODING 7915 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +3000 +1800 +0800 +0000 +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 1EEC +ENCODING 7916 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0E00 +0300 +0700 +0000 +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EED +ENCODING 7917 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +3C00 +0400 +0C00 +0000 +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 1EEE +ENCODING 7918 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0C80 +1F80 +1300 +0000 +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EEF +ENCODING 7919 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +3200 +7E00 +6E00 +0000 +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 1EF0 +ENCODING 7920 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 17 1 -3 +BITMAP +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EF1 +ENCODING 7921 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 -3 +BITMAP +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EF2 +ENCODING 7922 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0C00 +0600 +0200 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EF3 +ENCODING 7923 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +30 +10 +18 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 1EF4 +ENCODING 7924 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 17 0 -3 +BITMAP +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EF5 +ENCODING 7925 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +36 +F6 +E0 +ENDCHAR +STARTCHAR 1EF6 +ENCODING 7926 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0F00 +0100 +0300 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EF7 +ENCODING 7927 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +38 +04 +1C +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 1EF8 +ENCODING 7928 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0EC0 +0F80 +1B80 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EF9 +ENCODING 7929 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +32 +7E +4C +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 200C +ENCODING 8204 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 15 0 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 200D +ENCODING 8205 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 16 -2 -2 +BITMAP +90 +E0 +D0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 200E +ENCODING 8206 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 15 0 -3 +BITMAP +20 +F0 +A0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 200F +ENCODING 8207 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 15 -4 -3 +BITMAP +40 +F0 +50 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 2013 +ENCODING 8211 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 2 0 4 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR 2014 +ENCODING 8212 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 19 2 0 4 +BITMAP +FFFFE0 +FFFFE0 +ENDCHAR +STARTCHAR 2015 +ENCODING 8213 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 2 1 4 +BITMAP +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR 2017 +ENCODING 8215 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 5 0 -6 +BITMAP +FFE0 +FFE0 +0000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 2018 +ENCODING 8216 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +40 +C0 +80 +C0 +C0 +ENDCHAR +STARTCHAR 2019 +ENCODING 8217 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR 201A +ENCODING 8218 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 -3 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR 201B +ENCODING 8219 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +C0 +C0 +80 +C0 +40 +ENDCHAR +STARTCHAR 201C +ENCODING 8220 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 5 1 9 +BITMAP +50 +90 +90 +D0 +D0 +ENDCHAR +STARTCHAR 201D +ENCODING 8221 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 5 1 9 +BITMAP +D0 +D0 +50 +90 +90 +ENDCHAR +STARTCHAR 201E +ENCODING 8222 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 5 1 -3 +BITMAP +D0 +D0 +50 +90 +90 +ENDCHAR +STARTCHAR 2020 +ENCODING 8224 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +1800 +1800 +1800 +FF80 +FF80 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +ENDCHAR +STARTCHAR 2021 +ENCODING 8225 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +1800 +1800 +1800 +FF80 +FF80 +1800 +1800 +1800 +1800 +1800 +FF80 +FF80 +1800 +1800 +1800 +1800 +ENDCHAR +STARTCHAR 2022 +ENCODING 8226 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 5 1 4 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR 2026 +ENCODING 8230 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 15 2 2 0 +BITMAP +C106 +C106 +ENDCHAR +STARTCHAR 202A +ENCODING 8234 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 14 0 -3 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 202B +ENCODING 8235 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 14 -4 -3 +BITMAP +F0 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 202C +ENCODING 8236 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 16 -2 -3 +BITMAP +F0 +F0 +F0 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 202D +ENCODING 8237 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +F0 +80 +80 +80 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 202E +ENCODING 8238 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +F0 +10 +10 +10 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 2030 +ENCODING 8240 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 19 14 0 0 +BITMAP +78C000 +488000 +CC8000 +CD0000 +CD0000 +4B0000 +7A0000 +02E3C0 +059240 +059660 +0D1660 +099660 +099240 +10E3C0 +ENDCHAR +STARTCHAR 2032 +ENCODING 8242 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 5 1 9 +BITMAP +60 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR 2033 +ENCODING 8243 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 5 1 9 +BITMAP +78 +58 +D8 +D0 +90 +ENDCHAR +STARTCHAR 2039 +ENCODING 8249 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 9 1 1 +BITMAP +30 +20 +60 +40 +C0 +40 +60 +20 +30 +ENDCHAR +STARTCHAR 203A +ENCODING 8250 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 9 1 1 +BITMAP +C0 +40 +60 +20 +30 +20 +60 +40 +C0 +ENDCHAR +STARTCHAR 203C +ENCODING 8252 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 14 2 0 +BITMAP +CC +CC +CC +CC +CC +CC +CC +8C +8C +88 +88 +00 +CC +CC +ENDCHAR +STARTCHAR 203E +ENCODING 8254 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 7 2 0 11 +BITMAP +FE +FE +ENDCHAR +STARTCHAR 2044 +ENCODING 8260 +SWIDTH 154 0 +DWIDTH 3 0 +BBX 11 14 -4 0 +BITMAP +0020 +0040 +00C0 +0180 +0100 +0200 +0600 +0400 +0800 +1800 +3000 +2000 +4000 +C000 +ENDCHAR +STARTCHAR 206A +ENCODING 8298 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +F0 +40 +40 +40 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206B +ENCODING 8299 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +F0 +90 +90 +90 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206C +ENCODING 8300 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 16 -2 -3 +BITMAP +F0 +60 +60 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206D +ENCODING 8301 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 16 -2 -3 +BITMAP +40 +60 +60 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206E +ENCODING 8302 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +40 +60 +90 +60 +60 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206F +ENCODING 8303 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +C0 +40 +40 +40 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 207F +ENCODING 8319 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 7 1 5 +BITMAP +B0 +F8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR 20A3 +ENCODING 8355 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +3FC0 +3FC0 +2000 +2000 +2000 +2000 +3F80 +3F80 +2000 +2000 +FC00 +FC00 +2000 +2000 +ENDCHAR +STARTCHAR 20A4 +ENCODING 8356 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +1F00 +3F80 +3180 +60C0 +6000 +FE00 +FE00 +3000 +FE00 +FE00 +3000 +7C40 +FFC0 +4380 +ENDCHAR +STARTCHAR 20A7 +ENCODING 8359 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 14 0 0 +BITMAP +FE0000 +FF3000 +C3B000 +C1B000 +C1FFC0 +C3FFF0 +FFB430 +FE3700 +C037E0 +C031F0 +C03030 +C03630 +C03FF0 +C03BE0 +ENDCHAR +STARTCHAR 20AA +ENCODING 8362 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 10 1 0 +BITMAP +FF18 +FF98 +C098 +CC98 +CC98 +CC98 +CC98 +CC18 +CFF8 +CFF0 +ENDCHAR +STARTCHAR 20AB +ENCODING 8363 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 11 1 3 +BITMAP +0E +04 +3C +44 +44 +C4 +44 +44 +3C +00 +FE +ENDCHAR +STARTCHAR 20AC +ENCODING 8364 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0780 +1FC0 +3840 +3000 +6000 +6000 +FF80 +6000 +FF80 +6000 +3000 +3840 +1FC0 +0780 +ENDCHAR +STARTCHAR 2105 +ENCODING 8453 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +7820 +CC60 +8040 +80C0 +8480 +C980 +7900 +033C +0244 +0642 +04C2 +0842 +0844 +103C +ENDCHAR +STARTCHAR 2113 +ENCODING 8467 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 14 1 0 +BITMAP +30 +78 +48 +48 +50 +50 +60 +60 +C0 +C0 +40 +40 +78 +78 +ENDCHAR +STARTCHAR 2116 +ENCODING 8470 +SWIDTH 1028 0 +DWIDTH 20 0 +BBX 19 14 1 0 +BITMAP +E06000 +E06000 +F06000 +F06780 +D86FC0 +CC6C40 +CC6C60 +C66C40 +C76FC0 +C36780 +C1E000 +C1EFC0 +C0EFC0 +C06000 +ENDCHAR +STARTCHAR 2122 +ENCODING 8482 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 15 8 2 6 +BITMAP +FD86 +118E +114E +114E +1156 +1136 +1136 +1136 +ENDCHAR +STARTCHAR 2126 +ENCODING 8486 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7060 +6030 +6030 +C030 +C010 +C010 +6030 +6030 +3060 +18C0 +FDF8 +FDF8 +ENDCHAR +STARTCHAR 212E +ENCODING 8494 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 10 1 0 +BITMAP +3E00 +6100 +C180 +C180 +FFC0 +C000 +C000 +C080 +6100 +3E00 +ENDCHAR +STARTCHAR 2153 +ENCODING 8531 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +2010 +6030 +E020 +A040 +20C0 +2180 +2100 +023C +0664 +0C04 +0818 +1006 +3066 +603C +ENDCHAR +STARTCHAR 2154 +ENCODING 8532 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +7808 +4C18 +0C10 +1820 +3060 +60C0 +FC80 +011E +0332 +0602 +040C +0802 +1822 +301E +ENDCHAR +STARTCHAR 215B +ENCODING 8539 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +2010 +6030 +A020 +2040 +20C0 +2180 +2100 +0238 +0664 +0C64 +0838 +1044 +3044 +603C +ENDCHAR +STARTCHAR 215C +ENCODING 8540 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +7808 +4C18 +0C10 +1020 +0C60 +CCC0 +7880 +011E +0332 +0632 +041C +0822 +1822 +301E +ENDCHAR +STARTCHAR 215D +ENCODING 8541 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +7C08 +4018 +7810 +4C20 +0460 +CCC0 +7880 +011E +0332 +0632 +041C +0822 +1822 +301E +ENDCHAR +STARTCHAR 215E +ENCODING 8542 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +F810 +1020 +3060 +2040 +6080 +4180 +4300 +0238 +0464 +0C64 +1838 +1044 +2044 +603C +ENDCHAR +STARTCHAR 2190 +ENCODING 8592 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 6 1 1 +BITMAP +100000 +200000 +600000 +FFFF80 +600000 +100000 +ENDCHAR +STARTCHAR 2191 +ENCODING 8593 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 16 1 -4 +BITMAP +10 +38 +7C +D2 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 2192 +ENCODING 8594 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 6 1 1 +BITMAP +000400 +000200 +000300 +FFFF80 +000200 +000400 +ENDCHAR +STARTCHAR 2193 +ENCODING 8595 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 16 1 -4 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +90 +56 +3C +18 +10 +ENDCHAR +STARTCHAR 2194 +ENCODING 8596 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 7 1 1 +BITMAP +100400 +200200 +600300 +FFFF80 +600300 +100400 +100400 +ENDCHAR +STARTCHAR 2195 +ENCODING 8597 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 18 1 -4 +BITMAP +10 +18 +38 +74 +92 +10 +10 +10 +10 +10 +10 +10 +10 +90 +56 +3C +18 +10 +ENDCHAR +STARTCHAR 21A8 +ENCODING 8616 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 20 1 -6 +BITMAP +10 +18 +38 +74 +92 +10 +10 +10 +10 +10 +10 +10 +10 +90 +56 +3C +18 +10 +00 +FE +ENDCHAR +STARTCHAR 2202 +ENCODING 8706 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +0E +1E +33 +21 +01 +0F +3D +61 +C3 +82 +86 +CC +FC +70 +ENDCHAR +STARTCHAR 2206 +ENCODING 8710 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 12 0 1 +BITMAP +0600 +0600 +0A00 +0B00 +1100 +1180 +2180 +20C0 +20C0 +4040 +4060 +FFE0 +ENDCHAR +STARTCHAR 220F +ENCODING 8719 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 18 1 -4 +BITMAP +FFF8 +FFF8 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +ENDCHAR +STARTCHAR 2211 +ENCODING 8721 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +FFF0 +FFF0 +6000 +3000 +3800 +1800 +0C00 +0600 +0300 +0700 +0600 +0C00 +1800 +3000 +6000 +6000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 2212 +ENCODING 8722 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 2 1 6 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR 2215 +ENCODING 8725 +SWIDTH 154 0 +DWIDTH 3 0 +BBX 11 14 -4 0 +BITMAP +0020 +0040 +00C0 +0180 +0100 +0200 +0600 +0400 +0800 +1800 +3000 +2000 +4000 +C000 +ENDCHAR +STARTCHAR 2219 +ENCODING 8729 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 2 2 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 221A +ENCODING 8730 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 18 1 -1 +BITMAP +0080 +0080 +0080 +0080 +0080 +0080 +0100 +2100 +E100 +3100 +1900 +1900 +0E00 +0E00 +0600 +0600 +0200 +0200 +ENDCHAR +STARTCHAR 221E +ENCODING 8734 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 6 1 4 +BITMAP +71C0 +7BE0 +CE20 +CE20 +7BE0 +71C0 +ENDCHAR +STARTCHAR 221F +ENCODING 8735 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 12 12 3 0 +BITMAP +8000 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +FFF0 +ENDCHAR +STARTCHAR 2229 +ENCODING 8745 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +0F00 +3FC0 +70C0 +6060 +4020 +4020 +C020 +C020 +C020 +C020 +C020 +C020 +C020 +C020 +ENDCHAR +STARTCHAR 222B +ENCODING 8747 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 19 0 -2 +BITMAP +18 +38 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR 2248 +ENCODING 8776 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 7 0 3 +BITMAP +7C40 +FFC0 +8780 +0000 +7C40 +FFC0 +8780 +ENDCHAR +STARTCHAR 2260 +ENCODING 8800 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +0300 +0200 +0200 +0400 +FF80 +FF80 +0800 +1800 +FF80 +FF80 +2000 +2000 +4000 +4000 +ENDCHAR +STARTCHAR 2261 +ENCODING 8801 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 2 +BITMAP +FF80 +FF80 +0000 +0000 +FF80 +FF80 +0000 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR 2264 +ENCODING 8804 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 0 +BITMAP +0080 +0780 +1E00 +7000 +C000 +7000 +1E00 +0780 +0080 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR 2265 +ENCODING 8805 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 0 +BITMAP +8000 +E000 +7800 +0F00 +0180 +0F00 +7800 +E000 +8000 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR 2302 +ENCODING 8962 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 1 +BITMAP +0C00 +1200 +2100 +4100 +8080 +8080 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR 2310 +ENCODING 8976 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 6 1 4 +BITMAP +FF80 +FF80 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 2320 +ENCODING 8992 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 4 21 5 -5 +BITMAP +70 +10 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2321 +ENCODING 8993 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 4 21 2 -5 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +D0 +60 +ENDCHAR +STARTCHAR 2500 +ENCODING 9472 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 2 0 5 +BITMAP +FFFC +FFFC +ENDCHAR +STARTCHAR 2502 +ENCODING 9474 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 2 23 4 -6 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 250C +ENCODING 9484 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 13 6 -6 +BITMAP +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 2510 +ENCODING 9488 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 13 0 -6 +BITMAP +FF +FF +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR 2514 +ENCODING 9492 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 12 6 5 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +FF +ENDCHAR +STARTCHAR 2518 +ENCODING 9496 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 12 0 5 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +FF +FF +ENDCHAR +STARTCHAR 251C +ENCODING 9500 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 23 6 -6 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 2524 +ENCODING 9508 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 23 0 -6 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +FF +FF +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR 252C +ENCODING 9516 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 13 0 -6 +BITMAP +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 2534 +ENCODING 9524 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 12 0 5 +BITMAP +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +FFFC +FFFC +ENDCHAR +STARTCHAR 253C +ENCODING 9532 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 2550 +ENCODING 9552 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 5 0 3 +BITMAP +FFFC +0000 +0000 +FFFC +FFFC +ENDCHAR +STARTCHAR 2551 +ENCODING 9553 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 5 23 4 -6 +BITMAP +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +ENDCHAR +STARTCHAR 2552 +ENCODING 9554 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 14 6 -6 +BITMAP +FF +C0 +C0 +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 2553 +ENCODING 9555 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 13 4 -6 +BITMAP +FFC0 +FFC0 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +ENDCHAR +STARTCHAR 2554 +ENCODING 9556 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 14 4 -6 +BITMAP +FFC0 +C000 +C000 +CFC0 +CFC0 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +ENDCHAR +STARTCHAR 2555 +ENCODING 9557 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 14 0 -6 +BITMAP +FF +03 +03 +FF +FF +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR 2556 +ENCODING 9558 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 13 0 -6 +BITMAP +FF80 +FF80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2557 +ENCODING 9559 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 14 0 -6 +BITMAP +FF80 +0080 +0080 +FC80 +FC80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2558 +ENCODING 9560 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 14 6 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +C0 +C0 +FF +FF +ENDCHAR +STARTCHAR 2559 +ENCODING 9561 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 12 4 5 +BITMAP +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 255A +ENCODING 9562 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 14 4 3 +BITMAP +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +CFC0 +C000 +C000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 255B +ENCODING 9563 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 14 0 3 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +FF +03 +03 +FF +FF +ENDCHAR +STARTCHAR 255C +ENCODING 9564 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 12 0 5 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FF80 +FF80 +ENDCHAR +STARTCHAR 255D +ENCODING 9565 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 14 0 3 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FC80 +0080 +0080 +FF80 +FF80 +ENDCHAR +STARTCHAR 255E +ENCODING 9566 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 23 6 -6 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +C0 +C0 +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 255F +ENCODING 9567 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 23 4 -6 +BITMAP +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +CFC0 +CFC0 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +ENDCHAR +STARTCHAR 2560 +ENCODING 9568 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 23 4 -6 +BITMAP +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +CFC0 +C000 +C000 +CFC0 +CFC0 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +ENDCHAR +STARTCHAR 2561 +ENCODING 9569 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 23 0 -6 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +FF +03 +03 +FF +FF +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR 2562 +ENCODING 9570 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 23 0 -6 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FC80 +FC80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2563 +ENCODING 9571 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 23 0 -6 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FC80 +0080 +0080 +FC80 +FC80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2564 +ENCODING 9572 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 14 0 -6 +BITMAP +FFFC +0000 +0000 +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 2565 +ENCODING 9573 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 13 0 -6 +BITMAP +FFFC +FFFC +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2566 +ENCODING 9574 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 14 0 -6 +BITMAP +FFFC +0000 +0000 +FCFC +FCFC +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2567 +ENCODING 9575 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 14 0 3 +BITMAP +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +FFFC +0000 +0000 +FFFC +FFFC +ENDCHAR +STARTCHAR 2568 +ENCODING 9576 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 12 0 5 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FFFC +FFFC +ENDCHAR +STARTCHAR 2569 +ENCODING 9577 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 14 0 3 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FCFC +0000 +0000 +FFFC +FFFC +ENDCHAR +STARTCHAR 256A +ENCODING 9578 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +FFFC +0300 +0300 +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 256B +ENCODING 9579 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FFFC +FFFC +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 256C +ENCODING 9580 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FCFC +0000 +0000 +FCFC +FCFC +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2580 +ENCODING 9600 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 11 0 6 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 2584 +ENCODING 9604 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 12 0 -6 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 2588 +ENCODING 9608 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 258C +ENCODING 9612 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 7 23 0 -6 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR 2590 +ENCODING 9616 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 7 23 7 -6 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR 2591 +ENCODING 9617 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 22 1 -5 +BITMAP +8440 +0000 +2118 +0000 +8440 +0000 +0000 +2118 +0000 +8440 +0000 +2118 +0000 +0000 +8440 +0000 +2118 +0000 +8440 +0000 +0000 +2118 +ENDCHAR +STARTCHAR 2592 +ENCODING 9618 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 22 0 -5 +BITMAP +52A4 +0000 +AD58 +0000 +52A4 +0000 +0000 +AD58 +0000 +52A4 +0000 +AD58 +0000 +0000 +52A4 +0000 +AD58 +0000 +52A4 +0000 +0000 +AD58 +ENDCHAR +STARTCHAR 2593 +ENCODING 9619 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 14 23 0 -6 +BITMAP +5AB4 +FFFC +A548 +FFFC +5AB4 +FFFC +FFFC +A548 +FFFC +5AB4 +FFFC +A548 +FFFC +FFFC +5AB4 +FFFC +A548 +FFFC +5AB4 +FFFC +FFFC +A548 +FFFC +ENDCHAR +STARTCHAR 25A0 +ENCODING 9632 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 25A1 +ENCODING 9633 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +FF80 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR 25AA +ENCODING 9642 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 4 1 4 +BITMAP +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR 25AB +ENCODING 9643 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 4 1 4 +BITMAP +88 +88 +88 +F8 +ENDCHAR +STARTCHAR 25AC +ENCODING 9644 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 19 4 0 3 +BITMAP +FFFFE0 +FFFFE0 +FFFFE0 +FFFFE0 +ENDCHAR +STARTCHAR 25B2 +ENCODING 9650 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 13 13 3 0 +BITMAP +0200 +0200 +0700 +0700 +0F80 +0F80 +1FC0 +1FC0 +3FE0 +3FE0 +7FF0 +7FF0 +FFF8 +ENDCHAR +STARTCHAR 25BA +ENCODING 9658 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 13 13 3 0 +BITMAP +8000 +E000 +F800 +FE00 +FF80 +FFE0 +FFF8 +FFE0 +FF80 +FE00 +F800 +E000 +8000 +ENDCHAR +STARTCHAR 25BC +ENCODING 9660 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 13 13 3 0 +BITMAP +FFF8 +7FF0 +7FF0 +3FE0 +3FE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0200 +0200 +ENDCHAR +STARTCHAR 25C4 +ENCODING 9668 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 13 13 3 0 +BITMAP +0008 +0038 +00F8 +03F8 +0FF8 +3FF8 +FFF8 +3FF8 +0FF8 +03F8 +00F8 +0038 +0008 +ENDCHAR +STARTCHAR 25CA +ENCODING 9674 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +10 +28 +28 +44 +42 +82 +81 +81 +82 +42 +44 +28 +28 +10 +ENDCHAR +STARTCHAR 25CB +ENCODING 9675 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 8 2 1 +BITMAP +44 +82 +81 +01 +01 +80 +42 +38 +ENDCHAR +STARTCHAR 25CF +ENCODING 9679 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 8 2 1 +BITMAP +7C +FE +FF +FF +FF +FE +7E +38 +ENDCHAR +STARTCHAR 25D8 +ENCODING 9688 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +FF80 +FF80 +FF80 +E380 +E180 +E380 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 25D9 +ENCODING 9689 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 11 0 0 +BITMAP +FFE0 +FFE0 +E6E0 +DF60 +DFA0 +FFA0 +FFA0 +DFE0 +EF60 +F1E0 +FFE0 +ENDCHAR +STARTCHAR 25E6 +ENCODING 9702 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 5 1 4 +BITMAP +20 +90 +88 +88 +70 +ENDCHAR +STARTCHAR 263A +ENCODING 9786 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 12 12 4 -1 +BITMAP +0E00 +3080 +4040 +8020 +91A0 +9190 +8010 +8000 +9120 +4E20 +20C0 +1F00 +ENDCHAR +STARTCHAR 263B +ENCODING 9787 +SWIDTH 1028 0 +DWIDTH 20 0 +BBX 12 12 4 -1 +BITMAP +0F00 +3FC0 +7FE0 +7FE0 +EF70 +EF70 +FFF0 +FFF0 +7FE0 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 263C +ENCODING 9788 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 17 17 0 -2 +BITMAP +008000 +008000 +208200 +11E400 +0C1800 +080800 +000400 +100400 +F00780 +100400 +000400 +080800 +0C1800 +11E400 +208200 +008000 +008000 +ENDCHAR +STARTCHAR 2640 +ENCODING 9792 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 -4 +BITMAP +1E00 +0080 +0000 +8040 +8040 +8040 +0040 +4000 +2000 +0E00 +0000 +0000 +0000 +7FC0 +ENDCHAR +STARTCHAR 2642 +ENCODING 9794 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 17 1 -2 +BITMAP +0060 +0160 +0440 +0000 +0090 +0010 +0100 +0000 +2300 +4080 +8000 +8040 +8040 +8040 +8000 +4080 +2100 +ENDCHAR +STARTCHAR 2660 +ENCODING 9824 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 1 1 +BITMAP +1800 +3C00 +7E00 +FF00 +FF00 +FF80 +E700 +0000 +1800 +3E00 +ENDCHAR +STARTCHAR 2663 +ENCODING 9827 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +1E00 +1F00 +1F00 +7EC0 +FFE0 +FFE0 +FFE0 +F3C0 +0400 +0C00 +3F00 +ENDCHAR +STARTCHAR 2665 +ENCODING 9829 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 11 1 0 +BITMAP +F780 +FFC0 +FFC0 +FF80 +7F80 +7F00 +3E00 +1E00 +1C00 +0800 +0800 +ENDCHAR +STARTCHAR 2666 +ENCODING 9830 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +10 +18 +3C +7E +FE +FF +FE +7C +3C +18 +10 +ENDCHAR +STARTCHAR 266A +ENCODING 9834 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +0600 +0780 +0380 +0080 +0080 +0000 +0000 +0000 +0000 +7800 +F800 +F800 +7800 +ENDCHAR +STARTCHAR 266B +ENCODING 9835 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 15 1 -1 +BITMAP +0060 +03E0 +0FE0 +0E20 +0820 +0820 +0820 +0820 +0820 +09E0 +0BE0 +FBE0 +F9E0 +F800 +F000 +ENDCHAR +STARTCHAR E801 +ENCODING 59393 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 12 -1 0 +BITMAP +C0 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR E802 +ENCODING 59394 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 -4 +BITMAP +FC +FE +07 +03 +01 +01 +01 +31 +01 +31 +01 +01 +01 +01 +ENDCHAR +STARTCHAR E803 +ENCODING 59395 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 -4 +BITMAP +FC +FE +07 +03 +01 +01 +01 +79 +11 +11 +01 +01 +01 +01 +ENDCHAR +STARTCHAR E804 +ENCODING 59396 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 10 14 -2 0 +BITMAP +1000 +D000 +1000 +1000 +1FC0 +1FC0 +00C0 +00C0 +0080 +0180 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR E805 +ENCODING 59397 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 10 14 -2 0 +BITMAP +1000 +D000 +1000 +1000 +1FC0 +1FC0 +00C0 +0CC0 +0080 +0180 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR E818 +ENCODING 59416 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 7 1 12 +BITMAP +60 +80 +60 +80 +40 +60 +80 +ENDCHAR +STARTCHAR E83A +ENCODING 59450 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 13 2 -1 3 +BITMAP +FFF8 +FFF8 +ENDCHAR +STARTCHAR F001 +ENCODING 61441 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +1D +3D +30 +20 +F9 +F9 +21 +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR F002 +ENCODING 61442 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +1D +3D +31 +21 +F9 +F9 +21 +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR F004 +ENCODING 61444 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 4 2 -5 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR F005 +ENCODING 61445 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 3 1 -4 +BITMAP +70 +30 +E0 +ENDCHAR +STARTCHAR F006 +ENCODING 61446 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 2 -4 16 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR F007 +ENCODING 61447 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 16 +BITMAP +C0 +80 +ENDCHAR +STARTCHAR F008 +ENCODING 61448 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -3 11 +BITMAP +60 +40 +C0 +ENDCHAR +STARTCHAR F009 +ENCODING 61449 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -6 15 +BITMAP +60 +40 +C0 +ENDCHAR +STARTCHAR F00A +ENCODING 61450 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 21 0 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +00 +00 +00 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR F00B +ENCODING 61451 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 21 -2 -4 +BITMAP +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +F0 +ENDCHAR +STARTCHAR F00C +ENCODING 61452 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 21 0 -4 +BITMAP +80 +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR F00D +ENCODING 61453 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 21 -2 -4 +BITMAP +40 +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR F00E +ENCODING 61454 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 21 0 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR F00F +ENCODING 61455 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -8 11 +BITMAP +C0 +60 +20 +ENDCHAR +STARTCHAR F010 +ENCODING 61456 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 2 -5 16 +BITMAP +F0 +30 +ENDCHAR +STARTCHAR F011 +ENCODING 61457 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 2 -8 16 +BITMAP +E0 +60 +ENDCHAR +STARTCHAR F012 +ENCODING 61458 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -4 11 +BITMAP +E0 +30 +70 +ENDCHAR +STARTCHAR F013 +ENCODING 61459 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -7 15 +BITMAP +E0 +30 +70 +ENDCHAR +STARTCHAR F014 +ENCODING 61460 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -7 11 +BITMAP +E0 +30 +70 +ENDCHAR +STARTCHAR F015 +ENCODING 61461 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 2 -10 16 +BITMAP +72 +9C +ENDCHAR +STARTCHAR F016 +ENCODING 61462 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -10 15 +BITMAP +64 +9C +ENDCHAR +STARTCHAR F017 +ENCODING 61463 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -12 15 +BITMAP +64 +9C +ENDCHAR +STARTCHAR F018 +ENCODING 61464 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 2 -13 15 +BITMAP +76 +DC +ENDCHAR +STARTCHAR F019 +ENCODING 61465 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -8 11 +BITMAP +EC +98 +ENDCHAR +STARTCHAR F01A +ENCODING 61466 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -10 11 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F01B +ENCODING 61467 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -11 11 +BITMAP +64 +9C +ENDCHAR +STARTCHAR F01C +ENCODING 61468 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -6 15 +BITMAP +74 +DC +ENDCHAR +STARTCHAR F01D +ENCODING 61469 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -5 11 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F01E +ENCODING 61470 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F01F +ENCODING 61471 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -8 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F020 +ENCODING 61472 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -10 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F021 +ENCODING 61473 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -8 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F022 +ENCODING 61474 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 2 -10 -3 +BITMAP +80 +80 +ENDCHAR +STARTCHAR F023 +ENCODING 61475 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -6 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F024 +ENCODING 61476 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -6 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F025 +ENCODING 61477 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -6 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F026 +ENCODING 61478 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -8 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F027 +ENCODING 61479 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F028 +ENCODING 61480 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -9 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F029 +ENCODING 61481 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -4 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F02A +ENCODING 61482 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -3 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F02B +ENCODING 61483 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F02C +ENCODING 61484 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -2 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F02D +ENCODING 61485 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -9 16 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F02E +ENCODING 61486 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -9 15 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F02F +ENCODING 61487 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -10 16 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F030 +ENCODING 61488 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -10 15 +BITMAP +EC +98 +ENDCHAR +STARTCHAR F031 +ENCODING 61489 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR FB01 +ENCODING 64257 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +1D +3D +30 +20 +F9 +F9 +21 +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR FB02 +ENCODING 64258 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +1D +3D +31 +21 +F9 +F9 +21 +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR FB1D +ENCODING 64285 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 8 1 2 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +00 +40 +ENDCHAR +STARTCHAR FB1E +ENCODING 64286 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -3 12 +BITMAP +CC +78 +ENDCHAR +STARTCHAR FB1F +ENCODING 64287 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 7 1 3 +BITMAP +C6 +C6 +C6 +C6 +C6 +00 +FE +ENDCHAR +STARTCHAR FB20 +ENCODING 64288 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +6180 +2180 +3180 +3180 +3180 +3180 +1300 +1B00 +FE00 +FC00 +ENDCHAR +STARTCHAR FB2A +ENCODING 64298 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +0020 +0000 +0000 +C460 +C460 +C460 +CC60 +CC60 +F860 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB2B +ENCODING 64299 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +C000 +0000 +0000 +C460 +C460 +C460 +CC60 +CC60 +F860 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB2C +ENCODING 64300 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +0020 +0000 +0000 +C460 +C460 +C460 +CC60 +CC60 +FB60 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB2D +ENCODING 64301 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +C000 +0000 +0000 +C460 +C460 +C460 +CC60 +CC60 +FB60 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB2E +ENCODING 64302 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +E180 +6100 +3300 +3B00 +7F00 +4E00 +C600 +C600 +C300 +C180 +0000 +0000 +3C00 +ENDCHAR +STARTCHAR FB2F +ENCODING 64303 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 15 1 -5 +BITMAP +E180 +6100 +3300 +3B00 +7F00 +4E00 +C600 +C600 +C300 +C180 +0000 +0000 +3C00 +0800 +0800 +ENDCHAR +STARTCHAR FB30 +ENCODING 64304 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +E180 +6100 +3300 +3B00 +7F00 +4E00 +C600 +C600 +DB00 +C180 +ENDCHAR +STARTCHAR FB31 +ENCODING 64305 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 10 0 0 +BITMAP +7C00 +7E00 +0700 +0300 +3100 +0100 +0100 +0100 +FFC0 +FFC0 +ENDCHAR +STARTCHAR FB32 +ENCODING 64306 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +78 +7C +0C +3C +0C +1C +3C +64 +66 +C6 +ENDCHAR +STARTCHAR FB33 +ENCODING 64307 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +FF80 +FF80 +0300 +1B00 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR FB34 +ENCODING 64308 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +FE00 +7F00 +0380 +0180 +C980 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR FB35 +ENCODING 64309 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 10 0 0 +BITMAP +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR FB36 +ENCODING 64310 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +3F +3F +0C +D8 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR FB38 +ENCODING 64312 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +C700 +CF80 +C980 +C180 +CD80 +C180 +C180 +6380 +7F00 +1E00 +ENDCHAR +STARTCHAR FB39 +ENCODING 64313 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 5 0 5 +BITMAP +30 +30 +F0 +30 +30 +ENDCHAR +STARTCHAR FB3A +ENCODING 64314 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 -4 +BITMAP +FC +FE +07 +03 +11 +01 +01 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR FB3B +ENCODING 64315 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +F0 +FC +0C +06 +66 +06 +06 +0C +FC +F0 +ENDCHAR +STARTCHAR FB3C +ENCODING 64316 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +80 +80 +80 +80 +FE +FE +06 +26 +04 +0C +18 +18 +18 +18 +ENDCHAR +STARTCHAR FB3E +ENCODING 64318 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +CE00 +DF00 +7180 +6180 +6D80 +6180 +4180 +4180 +CF80 +CF80 +ENDCHAR +STARTCHAR FB40 +ENCODING 64320 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +E0 +F0 +30 +10 +90 +10 +10 +10 +F0 +F0 +ENDCHAR +STARTCHAR FB41 +ENCODING 64321 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +E380 +C180 +C980 +C180 +C180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR FB43 +ENCODING 64323 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +FC +FF +C3 +C3 +C1 +CD +61 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR FB44 +ENCODING 64324 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 1 0 +BITMAP +FC00 +FE00 +C700 +C300 +C180 +6D80 +0300 +8700 +FE00 +7C00 +ENDCHAR +STARTCHAR FB46 +ENCODING 64326 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +C3 +63 +33 +33 +7E +0C +04 +06 +7F +7F +ENDCHAR +STARTCHAR FB47 +ENCODING 64327 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +FF +FF +01 +19 +43 +43 +46 +44 +44 +44 +40 +40 +40 +40 +ENDCHAR +STARTCHAR FB48 +ENCODING 64328 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 0 0 +BITMAP +FC +FE +07 +03 +11 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR FB49 +ENCODING 64329 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +C460 +C460 +C460 +CC60 +CC60 +FB60 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB4A +ENCODING 64330 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +7F80 +7FC0 +18E0 +1860 +1B60 +1860 +1860 +1860 +7860 +F060 +ENDCHAR +STARTCHAR FB4B +ENCODING 64331 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 13 1 0 +BITMAP +40 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR FB4C +ENCODING 64332 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +1C00 +0000 +0000 +7C00 +7E00 +0700 +0300 +0100 +0100 +0100 +0100 +FFC0 +FFC0 +ENDCHAR +STARTCHAR FB4D +ENCODING 64333 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +78 +00 +00 +F0 +FC +0C +06 +06 +06 +06 +0C +FC +F0 +ENDCHAR +STARTCHAR FB4E +ENCODING 64334 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 1 0 +BITMAP +3C00 +0000 +0000 +FC00 +FE00 +C700 +C300 +C180 +7180 +0300 +8700 +FE00 +7C00 +ENDCHAR +STARTCHAR FB4F +ENCODING 64335 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +8000 +8000 +8000 +8000 +E180 +E180 +3180 +3B00 +7F00 +6E00 +4600 +4700 +C300 +C180 +ENDCHAR +STARTCHAR FB50 +ENCODING 64336 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 15 0 2 +BITMAP +30 +F0 +80 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR FB51 +ENCODING 64337 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 14 -1 3 +BITMAP +30 +F0 +00 +00 +60 +20 +20 +20 +20 +20 +20 +20 +18 +18 +ENDCHAR +STARTCHAR FB52 +ENCODING 64338 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0200 +0200 +0200 +0200 +ENDCHAR +STARTCHAR FB53 +ENCODING 64339 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0200 +0200 +0200 +0200 +ENDCHAR +STARTCHAR FB54 +ENCODING 64340 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +30 +30 +10 +10 +ENDCHAR +STARTCHAR FB55 +ENCODING 64341 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +30 +30 +10 +10 +ENDCHAR +STARTCHAR FB56 +ENCODING 64342 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0100 +0500 +0700 +0300 +ENDCHAR +STARTCHAR FB57 +ENCODING 64343 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0100 +0500 +0700 +0300 +ENDCHAR +STARTCHAR FB58 +ENCODING 64344 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +38 +18 +ENDCHAR +STARTCHAR FB59 +ENCODING 64345 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +38 +18 +ENDCHAR +STARTCHAR FB5A +ENCODING 64346 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 12 1 -3 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0300 +0D00 +0D00 +0500 +0400 +ENDCHAR +STARTCHAR FB5B +ENCODING 64347 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 12 1 -3 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0300 +0D00 +0D00 +0500 +0400 +ENDCHAR +STARTCHAR FB5C +ENCODING 64348 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 -3 +BITMAP +08 +08 +0C +04 +FC +FC +00 +18 +68 +68 +28 +20 +ENDCHAR +STARTCHAR FB5D +ENCODING 64349 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 -3 +BITMAP +08 +08 +0C +04 +FC +FC +00 +18 +68 +68 +28 +20 +ENDCHAR +STARTCHAR FB5E +ENCODING 64350 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0400 +0400 +0600 +0200 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB5F +ENCODING 64351 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0400 +0400 +0600 +0200 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB60 +ENCODING 64352 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +20 +20 +30 +10 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB61 +ENCODING 64353 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +20 +20 +30 +10 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB62 +ENCODING 64354 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0200 +0A00 +0900 +0D00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB63 +ENCODING 64355 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0200 +0A00 +0900 +0D00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB64 +ENCODING 64356 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +50 +48 +68 +60 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB65 +ENCODING 64357 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +50 +48 +68 +60 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB66 +ENCODING 64358 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 13 1 3 +BITMAP +0400 +0800 +0400 +0780 +0480 +1F80 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB67 +ENCODING 64359 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 13 1 3 +BITMAP +0400 +0800 +0400 +0780 +0480 +1F80 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB68 +ENCODING 64360 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +20 +20 +20 +2C +34 +7C +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB69 +ENCODING 64361 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +20 +20 +20 +2C +34 +7C +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB6A +ENCODING 64362 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0010 +001C +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FB6B +ENCODING 64363 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0010 +001C +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FB6C +ENCODING 64364 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 3 +BITMAP +20 +38 +78 +60 +18 +38 +2C +3C +3C +04 +FC +FC +ENDCHAR +STARTCHAR FB6D +ENCODING 64365 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 3 +BITMAP +20 +28 +68 +20 +18 +1C +24 +24 +1C +0C +FC +FC +ENDCHAR +STARTCHAR FB6E +ENCODING 64366 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 12 0 3 +BITMAP +0004 +0014 +0014 +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FB6F +ENCODING 64367 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 12 0 3 +BITMAP +0004 +0014 +0014 +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FB70 +ENCODING 64368 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 14 -1 3 +BITMAP +10 +50 +48 +68 +60 +00 +18 +38 +2C +3C +3C +04 +FC +FC +ENDCHAR +STARTCHAR FB71 +ENCODING 64369 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 14 -1 3 +BITMAP +10 +50 +48 +68 +60 +00 +18 +1C +24 +24 +1C +0C +FC +FC +ENDCHAR +STARTCHAR FB72 +ENCODING 64370 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8400 +8400 +8600 +4600 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB73 +ENCODING 64371 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8800 +8800 +8C00 +4C00 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB74 +ENCODING 64372 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 -2 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0400 +0400 +0600 +0600 +ENDCHAR +STARTCHAR FB75 +ENCODING 64373 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 -2 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0400 +0400 +0600 +0600 +ENDCHAR +STARTCHAR FB76 +ENCODING 64374 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8300 +8B00 +8800 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB77 +ENCODING 64375 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8400 +9400 +9000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB78 +ENCODING 64376 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 -1 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0800 +ENDCHAR +STARTCHAR FB79 +ENCODING 64377 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 -1 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0800 +ENDCHAR +STARTCHAR FB7A +ENCODING 64378 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4200 +8B00 +8A00 +8200 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB7B +ENCODING 64379 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8400 +9400 +9400 +4400 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB7C +ENCODING 64380 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 -2 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0E00 +0200 +ENDCHAR +STARTCHAR FB7D +ENCODING 64381 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 -2 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0E00 +0200 +ENDCHAR +STARTCHAR FB7E +ENCODING 64382 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4300 +8B00 +8D00 +8500 +4400 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB7F +ENCODING 64383 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +45C0 +9400 +9600 +9E00 +5800 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB80 +ENCODING 64384 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 12 -1 -3 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0B00 +0D00 +0C00 +ENDCHAR +STARTCHAR FB81 +ENCODING 64385 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 12 -1 -3 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0B00 +0D00 +0C00 +ENDCHAR +STARTCHAR FB82 +ENCODING 64386 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 -1 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +00 +10 +50 +40 +ENDCHAR +STARTCHAR FB83 +ENCODING 64387 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 -1 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +00 +10 +50 +40 +ENDCHAR +STARTCHAR FB84 +ENCODING 64388 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +30 +D0 +C0 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FB85 +ENCODING 64389 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +30 +D0 +C0 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FB86 +ENCODING 64390 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 13 1 3 +BITMAP +40 +50 +50 +40 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FB87 +ENCODING 64391 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 13 1 3 +BITMAP +40 +50 +50 +40 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FB88 +ENCODING 64392 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 15 0 3 +BITMAP +20 +20 +20 +2C +34 +FC +00 +10 +18 +0C +04 +04 +04 +7C +7C +ENDCHAR +STARTCHAR FB89 +ENCODING 64393 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 15 0 3 +BITMAP +20 +20 +20 +2C +34 +FC +00 +10 +18 +0C +04 +04 +04 +7C +7C +ENDCHAR +STARTCHAR FB8A +ENCODING 64394 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 15 1 -2 +BITMAP +0C +0F +0B +08 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FB8B +ENCODING 64395 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 15 1 -2 +BITMAP +0C +0F +0B +08 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FB8C +ENCODING 64396 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 17 1 -2 +BITMAP +08 +10 +08 +0F +09 +3F +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FB8D +ENCODING 64397 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 17 1 -2 +BITMAP +08 +10 +08 +0F +09 +3F +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FB8E +ENCODING 64398 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0006 +001E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR FB8F +ENCODING 64399 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 11 0 3 +BITMAP +000600 +001E00 +007800 +004000 +006000 +007000 +001800 +800C00 +801200 +FFF3C0 +7FE1C0 +ENDCHAR +STARTCHAR FB90 +ENCODING 64400 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 11 -1 3 +BITMAP +03 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FB91 +ENCODING 64401 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 3 +BITMAP +0300 +0F00 +3C00 +2000 +3000 +3800 +0C00 +0600 +0900 +F9E0 +F0E0 +ENDCHAR +STARTCHAR FB92 +ENCODING 64402 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR FB93 +ENCODING 64403 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 14 0 3 +BITMAP +000200 +000E00 +003800 +006600 +009E00 +007800 +004000 +006000 +007000 +001800 +800C00 +801200 +FFF3C0 +7FE1C0 +ENDCHAR +STARTCHAR FB94 +ENCODING 64404 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 14 -1 3 +BITMAP +01 +07 +1C +33 +4F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FB95 +ENCODING 64405 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 14 -1 3 +BITMAP +0100 +0700 +1C00 +3300 +4F00 +3C00 +2000 +3000 +3800 +0C00 +0600 +0900 +F9E0 +F0E0 +ENDCHAR +STARTCHAR FB96 +ENCODING 64406 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 19 0 -2 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +0000 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR FB97 +ENCODING 64407 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 19 0 -2 +BITMAP +000200 +000E00 +003800 +006600 +009E00 +007800 +004000 +006000 +007000 +001800 +800C00 +801200 +FFF3C0 +7FE1C0 +000000 +020000 +020000 +020000 +020000 +ENDCHAR +STARTCHAR FB98 +ENCODING 64408 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 19 -1 -2 +BITMAP +01 +07 +1C +33 +4F +3C +20 +30 +38 +0C +02 +01 +FF +FF +00 +08 +08 +0C +0C +ENDCHAR +STARTCHAR FB99 +ENCODING 64409 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 19 -1 -2 +BITMAP +0100 +0700 +1C00 +3300 +4F00 +3C00 +2000 +3000 +3800 +0C00 +0600 +0900 +F9E0 +F0E0 +0000 +3000 +3000 +1000 +1000 +ENDCHAR +STARTCHAR FB9A +ENCODING 64410 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0012 +004E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR FB9B +ENCODING 64411 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 14 0 3 +BITMAP +001200 +004E00 +003800 +006600 +009E00 +007800 +004000 +006000 +007000 +001800 +800C00 +801200 +FFF3C0 +7FE1C0 +ENDCHAR +STARTCHAR FB9C +ENCODING 64412 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 14 -1 3 +BITMAP +09 +27 +1C +33 +4F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FB9D +ENCODING 64413 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 14 -1 3 +BITMAP +0900 +2700 +1C00 +3300 +4F00 +3C00 +2000 +3000 +3800 +0C00 +0600 +0900 +F9E0 +F0E0 +ENDCHAR +STARTCHAR FB9E +ENCODING 64414 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FB9F +ENCODING 64415 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FBA0 +ENCODING 64416 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 1 -1 +BITMAP +1000 +1000 +1000 +1600 +1A00 +3E00 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FBA1 +ENCODING 64417 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 1 -1 +BITMAP +1000 +1000 +1000 +1600 +1A00 +3E00 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FBA2 +ENCODING 64418 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +20 +20 +20 +2C +34 +7C +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FBA3 +ENCODING 64419 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +20 +20 +20 +2C +34 +7C +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FBA4 +ENCODING 64420 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 12 1 3 +BITMAP +60 +80 +60 +80 +00 +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR FBA5 +ENCODING 64421 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 13 0 3 +BITMAP +30 +40 +30 +40 +10 +10 +28 +48 +F8 +E8 +08 +06 +06 +ENDCHAR +STARTCHAR FBA6 +ENCODING 64422 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 7 1 3 +BITMAP +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR FBA7 +ENCODING 64423 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +18 +3C +6E +46 +80 +ENDCHAR +STARTCHAR FBA8 +ENCODING 64424 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +10 +20 +30 +10 +ENDCHAR +STARTCHAR FBA9 +ENCODING 64425 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 7 12 -1 -4 +BITMAP +10 +10 +10 +F6 +DE +18 +10 +00 +08 +10 +08 +08 +ENDCHAR +STARTCHAR FBAA +ENCODING 64426 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 8 -1 3 +BITMAP +08 +1C +1C +26 +27 +19 +FF +E7 +ENDCHAR +STARTCHAR FBAB +ENCODING 64427 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 9 0 4 +BITMAP +10 +10 +28 +48 +F8 +E8 +08 +06 +06 +ENDCHAR +STARTCHAR FBAC +ENCODING 64428 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 8 -1 3 +BITMAP +08 +1C +1C +26 +27 +19 +FF +E7 +ENDCHAR +STARTCHAR FBAD +ENCODING 64429 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 10 -1 -1 +BITMAP +04 +0C +14 +18 +FF +FF +24 +34 +1E +0C +ENDCHAR +STARTCHAR FBAE +ENCODING 64430 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 7 1 0 +BITMAP +0600 +0E00 +3800 +7000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR FBAF +ENCODING 64431 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 9 1 -4 +BITMAP +00FC +07FC +1F00 +3800 +6000 +8000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR FBB0 +ENCODING 64432 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 10 1 0 +BITMAP +0800 +3000 +1800 +2600 +0E00 +3800 +7000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR FBB1 +ENCODING 64433 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 14 1 -4 +BITMAP +0020 +0040 +0020 +0040 +0000 +00FC +07FC +1F00 +3800 +6000 +8000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR FBD3 +ENCODING 64467 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 3 +BITMAP +0C00 +0E40 +0B60 +0860 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR FBD4 +ENCODING 64468 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 3 +BITMAP +0C00 +0E40 +0B60 +0860 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR FBD5 +ENCODING 64469 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 13 -1 3 +BITMAP +30 +0C +23 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FBD6 +ENCODING 64470 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 13 -1 3 +BITMAP +30 +0C +23 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FBD7 +ENCODING 64471 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -2 +BITMAP +03 +03 +03 +03 +04 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBD8 +ENCODING 64472 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -2 +BITMAP +03 +03 +03 +03 +04 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBD9 +ENCODING 64473 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +05 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDA +ENCODING 64474 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +05 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDB +ENCODING 64475 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -1 +BITMAP +02 +02 +02 +02 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDC +ENCODING 64476 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -1 +BITMAP +02 +02 +02 +02 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDD +ENCODING 64477 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 9 16 0 -2 +BITMAP +0C80 +0D00 +0C80 +0D00 +1000 +0300 +0700 +0500 +0500 +0700 +0300 +0100 +0100 +0200 +8600 +7C00 +ENDCHAR +STARTCHAR FBDE +ENCODING 64478 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +04 +07 +0D +0C +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDF +ENCODING 64479 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +04 +07 +0D +0C +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBE0 +ENCODING 64480 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +19 +07 +02 +86 +7C +ENDCHAR +STARTCHAR FBE1 +ENCODING 64481 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +19 +07 +02 +86 +7C +ENDCHAR +STARTCHAR FBE2 +ENCODING 64482 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +02 +05 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBE3 +ENCODING 64483 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +02 +05 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBE4 +ENCODING 64484 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0000 +0400 +0400 +ENDCHAR +STARTCHAR FBE5 +ENCODING 64485 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 9 0 -4 +BITMAP +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +0400 +0400 +ENDCHAR +STARTCHAR FBE6 +ENCODING 64486 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +30 +30 +10 +10 +ENDCHAR +STARTCHAR FBE7 +ENCODING 64487 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +30 +30 +10 +10 +ENDCHAR +STARTCHAR FBFC +ENCODING 64508 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR FBFD +ENCODING 64509 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 7 0 -2 +BITMAP +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +ENDCHAR +STARTCHAR FBFE +ENCODING 64510 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 -1 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +20 +ENDCHAR +STARTCHAR FBFF +ENCODING 64511 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 -1 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +20 +ENDCHAR +STARTCHAR FC5E +ENCODING 64606 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 8 0 12 +BITMAP +10 +30 +50 +F0 +40 +20 +30 +40 +ENDCHAR +STARTCHAR FC5F +ENCODING 64607 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 7 1 12 +BITMAP +40 +60 +80 +60 +80 +60 +80 +ENDCHAR +STARTCHAR FC60 +ENCODING 64608 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 5 1 12 +BITMAP +60 +80 +40 +60 +80 +ENDCHAR +STARTCHAR FC61 +ENCODING 64609 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 7 1 12 +BITMAP +60 +60 +60 +80 +40 +60 +80 +ENDCHAR +STARTCHAR FC62 +ENCODING 64610 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 5 1 12 +BITMAP +40 +60 +80 +60 +80 +ENDCHAR +STARTCHAR FD3E +ENCODING 64830 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 19 1 -4 +BITMAP +10 +10 +20 +60 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +40 +60 +60 +20 +10 +10 +ENDCHAR +STARTCHAR FD3F +ENCODING 64831 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 19 1 -4 +BITMAP +80 +80 +40 +60 +60 +20 +30 +30 +30 +30 +30 +30 +30 +20 +60 +60 +40 +80 +80 +ENDCHAR +STARTCHAR FDF2 +ENCODING 65010 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 13 0 3 +BITMAP +0200 +0000 +0080 +0580 +0600 +0100 +0120 +0920 +1920 +2920 +49A0 +FFE0 +E760 +ENDCHAR +STARTCHAR FE80 +ENCODING 65152 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 8 1 1 +BITMAP +30 +70 +40 +CC +FC +70 +60 +40 +ENDCHAR +STARTCHAR FE81 +ENCODING 65153 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 14 0 2 +BITMAP +F0 +00 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR FE82 +ENCODING 65154 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 13 0 3 +BITMAP +E0 +00 +00 +C0 +40 +40 +40 +40 +40 +40 +40 +30 +30 +ENDCHAR +STARTCHAR FE83 +ENCODING 65155 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 2 +BITMAP +40 +80 +C0 +80 +00 +00 +80 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR FE84 +ENCODING 65156 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 13 0 3 +BITMAP +40 +80 +60 +80 +00 +40 +C0 +40 +40 +40 +40 +70 +30 +ENDCHAR +STARTCHAR FE85 +ENCODING 65157 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +10 +0C +10 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FE86 +ENCODING 65158 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +10 +0C +10 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FE87 +ENCODING 65159 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 16 0 -2 +BITMAP +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +60 +80 +60 +80 +ENDCHAR +STARTCHAR FE88 +ENCODING 65160 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 15 0 -1 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +30 +30 +00 +40 +80 +60 +80 +ENDCHAR +STARTCHAR FE89 +ENCODING 65161 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 12 0 -1 +BITMAP +2000 +4000 +6060 +40F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR FE8A +ENCODING 65162 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 -2 +BITMAP +2000 +4000 +6000 +4000 +0000 +0000 +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +ENDCHAR +STARTCHAR FE8B +ENCODING 65163 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +20 +10 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE8C +ENCODING 65164 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +20 +10 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE8D +ENCODING 65165 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 11 1 3 +BITMAP +80 +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR FE8E +ENCODING 65166 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 10 0 4 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +30 +30 +ENDCHAR +STARTCHAR FE8F +ENCODING 65167 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 0 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0600 +0600 +ENDCHAR +STARTCHAR FE90 +ENCODING 65168 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 0 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0600 +0600 +ENDCHAR +STARTCHAR FE91 +ENCODING 65169 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 9 -1 0 +BITMAP +08 +08 +0C +04 +FC +FC +00 +10 +10 +ENDCHAR +STARTCHAR FE92 +ENCODING 65170 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 9 -1 0 +BITMAP +08 +08 +0C +04 +FC +FC +00 +10 +10 +ENDCHAR +STARTCHAR FE93 +ENCODING 65171 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 11 0 3 +BITMAP +10 +D0 +C0 +00 +20 +30 +78 +48 +48 +78 +70 +ENDCHAR +STARTCHAR FE94 +ENCODING 65172 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 14 0 3 +BITMAP +10 +50 +40 +00 +00 +10 +10 +28 +48 +F8 +E8 +08 +06 +06 +ENDCHAR +STARTCHAR FE95 +ENCODING 65173 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 3 +BITMAP +0300 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FE96 +ENCODING 65174 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 3 +BITMAP +0300 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FE97 +ENCODING 65175 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 3 +BITMAP +08 +28 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE98 +ENCODING 65176 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 3 +BITMAP +08 +28 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE99 +ENCODING 65177 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 10 1 3 +BITMAP +0400 +0700 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FE9A +ENCODING 65178 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 10 1 3 +BITMAP +0400 +0700 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FE9B +ENCODING 65179 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +20 +28 +28 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE9C +ENCODING 65180 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +20 +28 +28 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE9D +ENCODING 65181 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8600 +8600 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FE9E +ENCODING 65182 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8000 +8400 +8400 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FE9F +ENCODING 65183 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 9 -1 0 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0400 +0400 +ENDCHAR +STARTCHAR FEA0 +ENCODING 65184 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 9 -1 0 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0400 +0400 +ENDCHAR +STARTCHAR FEA1 +ENCODING 65185 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FEA2 +ENCODING 65186 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FEA3 +ENCODING 65187 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 6 -1 3 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR FEA4 +ENCODING 65188 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 6 -1 3 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR FEA5 +ENCODING 65189 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0400 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FEA6 +ENCODING 65190 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 16 0 -4 +BITMAP +0400 +0400 +0000 +0000 +3F80 +7F80 +0E00 +31C0 +41C0 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FEA7 +ENCODING 65191 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 3 +BITMAP +0400 +0400 +0000 +0000 +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR FEA8 +ENCODING 65192 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 3 +BITMAP +0400 +0400 +0000 +0000 +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR FEA9 +ENCODING 65193 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 8 1 3 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEAA +ENCODING 65194 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 8 1 3 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEAB +ENCODING 65195 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +40 +60 +00 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEAC +ENCODING 65196 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +40 +60 +00 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEAD +ENCODING 65197 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 1 -2 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FEAE +ENCODING 65198 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 1 -2 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FEAF +ENCODING 65199 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -2 +BITMAP +04 +04 +00 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FEB0 +ENCODING 65200 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -2 +BITMAP +04 +04 +00 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FEB1 +ENCODING 65201 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 9 1 -1 +BITMAP +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR FEB2 +ENCODING 65202 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 9 1 -1 +BITMAP +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR FEB3 +ENCODING 65203 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 5 -1 3 +BITMAP +0020 +10A0 +08A0 +FFE0 +FF60 +ENDCHAR +STARTCHAR FEB4 +ENCODING 65204 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 5 -1 3 +BITMAP +0020 +10A0 +08A0 +FFE0 +FF60 +ENDCHAR +STARTCHAR FEB5 +ENCODING 65205 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 -1 +BITMAP +0030 +0038 +0028 +0020 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR FEB6 +ENCODING 65206 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 -1 +BITMAP +0030 +0038 +0028 +0020 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR FEB7 +ENCODING 65207 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 3 +BITMAP +0100 +01C0 +0340 +0300 +0000 +0020 +10A0 +08A0 +FFE0 +FF60 +ENDCHAR +STARTCHAR FEB8 +ENCODING 65208 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 3 +BITMAP +0100 +01C0 +0340 +0300 +0000 +0020 +10A0 +08A0 +FFE0 +FF60 +ENDCHAR +STARTCHAR FEB9 +ENCODING 65209 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 9 1 -1 +BITMAP +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR FEBA +ENCODING 65210 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 9 1 -1 +BITMAP +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR FEBB +ENCODING 65211 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 6 -1 3 +BITMAP +000700 +001F80 +103180 +08C180 +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR FEBC +ENCODING 65212 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 6 -1 3 +BITMAP +000700 +001F80 +103180 +08C180 +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR FEBD +ENCODING 65213 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 12 1 -1 +BITMAP +000800 +000800 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR FEBE +ENCODING 65214 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 12 1 -1 +BITMAP +000800 +000800 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR FEBF +ENCODING 65215 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 9 -1 3 +BITMAP +006000 +006000 +000000 +000700 +001F80 +103180 +08C180 +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR FEC0 +ENCODING 65216 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 9 -1 3 +BITMAP +006000 +006000 +000000 +000700 +001F80 +103180 +08C180 +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR FEC1 +ENCODING 65217 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC2 +ENCODING 65218 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC3 +ENCODING 65219 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC4 +ENCODING 65220 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC5 +ENCODING 65221 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC6 +ENCODING 65222 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC7 +ENCODING 65223 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC8 +ENCODING 65224 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC9 +ENCODING 65225 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 0 -4 +BITMAP +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR FECA +ENCODING 65226 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 9 13 0 -4 +BITMAP +1C00 +3C00 +1C00 +3C00 +2780 +4380 +4000 +8000 +4000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FECB +ENCODING 65227 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 6 -1 3 +BITMAP +1E00 +3F00 +2040 +3380 +FF00 +FC00 +ENDCHAR +STARTCHAR FECC +ENCODING 65228 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 6 -1 3 +BITMAP +1E +3E +3E +0C +FF +E3 +ENDCHAR +STARTCHAR FECD +ENCODING 65229 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 20 0 -4 +BITMAP +1000 +1000 +0000 +0000 +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR FECE +ENCODING 65230 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 9 17 0 -4 +BITMAP +0800 +0800 +0000 +0000 +1C00 +3C00 +1C00 +3C00 +2780 +4380 +4000 +8000 +4000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FECF +ENCODING 65231 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 9 -1 3 +BITMAP +0C00 +0C00 +0000 +1E00 +3F00 +2040 +3380 +FF00 +FC00 +ENDCHAR +STARTCHAR FED0 +ENCODING 65232 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 10 -1 3 +BITMAP +08 +08 +00 +00 +1E +3E +3E +0C +FF +E3 +ENDCHAR +STARTCHAR FED1 +ENCODING 65233 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 10 0 3 +BITMAP +0018 +0018 +0000 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FED2 +ENCODING 65234 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 10 0 3 +BITMAP +0018 +0018 +0000 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FED3 +ENCODING 65235 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +10 +00 +18 +38 +2C +3C +3C +04 +FC +FC +ENDCHAR +STARTCHAR FED4 +ENCODING 65236 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 3 +BITMAP +08 +08 +00 +00 +18 +1C +24 +24 +1C +0C +FC +FC +ENDCHAR +STARTCHAR FED5 +ENCODING 65237 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -1 +BITMAP +0100 +0580 +0400 +0000 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR FED6 +ENCODING 65238 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -1 +BITMAP +0100 +0580 +0400 +0000 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR FED7 +ENCODING 65239 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 3 +BITMAP +08 +28 +20 +00 +18 +38 +2C +3C +3C +04 +FC +FC +ENDCHAR +STARTCHAR FED8 +ENCODING 65240 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +08 +28 +20 +00 +00 +18 +1C +24 +24 +1C +0C +FC +FC +ENDCHAR +STARTCHAR FED9 +ENCODING 65241 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 12 0 3 +BITMAP +0040 +0060 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR FEDA +ENCODING 65242 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 12 0 3 +BITMAP +0040 +0060 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR FEDB +ENCODING 65243 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 11 -1 3 +BITMAP +03 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FEDC +ENCODING 65244 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 11 -1 3 +BITMAP +03 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FEDD +ENCODING 65245 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 0 +BITMAP +0200 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR FEDE +ENCODING 65246 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 0 +BITMAP +0200 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR FEDF +ENCODING 65247 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 12 -1 3 +BITMAP +20 +38 +10 +10 +10 +10 +10 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEE0 +ENCODING 65248 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 12 -1 3 +BITMAP +20 +38 +10 +10 +10 +10 +10 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEE1 +ENCODING 65249 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 11 0 -4 +BITMAP +38 +3C +0C +3C +7C +C0 +80 +80 +40 +40 +40 +ENDCHAR +STARTCHAR FEE2 +ENCODING 65250 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 11 0 -4 +BITMAP +38 +3C +0C +3C +7C +C0 +80 +80 +40 +40 +40 +ENDCHAR +STARTCHAR FEE3 +ENCODING 65251 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 5 -1 3 +BITMAP +02 +0D +1D +FF +F7 +ENDCHAR +STARTCHAR FEE4 +ENCODING 65252 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 5 -1 3 +BITMAP +02 +0D +1D +FF +F7 +ENDCHAR +STARTCHAR FEE5 +ENCODING 65253 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 -1 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FEE6 +ENCODING 65254 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 -1 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FEE7 +ENCODING 65255 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 9 -1 3 +BITMAP +10 +10 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FEE8 +ENCODING 65256 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 9 -1 3 +BITMAP +10 +10 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FEE9 +ENCODING 65257 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 7 1 3 +BITMAP +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR FEEA +ENCODING 65258 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 9 0 4 +BITMAP +10 +10 +28 +48 +F8 +E8 +08 +06 +06 +ENDCHAR +STARTCHAR FEEB +ENCODING 65259 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 8 -1 3 +BITMAP +08 +1C +1C +26 +27 +19 +FF +E7 +ENDCHAR +STARTCHAR FEEC +ENCODING 65260 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 10 -1 -1 +BITMAP +04 +0C +14 +18 +FF +FF +24 +34 +1E +0C +ENDCHAR +STARTCHAR FEED +ENCODING 65261 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FEEE +ENCODING 65262 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FEEF +ENCODING 65263 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR FEF0 +ENCODING 65264 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 7 0 -2 +BITMAP +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +ENDCHAR +STARTCHAR FEF1 +ENCODING 65265 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0300 +0B00 +0800 +ENDCHAR +STARTCHAR FEF2 +ENCODING 65266 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 9 0 -4 +BITMAP +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +0A00 +0A00 +ENDCHAR +STARTCHAR FEF3 +ENCODING 65267 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 -1 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +20 +ENDCHAR +STARTCHAR FEF4 +ENCODING 65268 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 -1 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +20 +ENDCHAR +STARTCHAR FEF5 +ENCODING 65269 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 1 +BITMAP +E000 +0000 +8200 +C380 +E100 +6100 +1100 +0A00 +0A00 +0600 +0400 +0600 +1A00 +1E00 +1C00 +ENDCHAR +STARTCHAR FEF6 +ENCODING 65270 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 13 1 3 +BITMAP +E000 +0000 +C000 +F100 +7900 +0500 +0280 +0080 +0180 +0280 +0680 +3CC0 +F840 +ENDCHAR +STARTCHAR FEF7 +ENCODING 65271 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 15 0 1 +BITMAP +6000 +8000 +6100 +81C0 +0080 +4080 +6080 +3080 +0900 +0500 +0300 +0200 +0500 +0F00 +0E00 +ENDCHAR +STARTCHAR FEF8 +ENCODING 65272 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 13 1 3 +BITMAP +4000 +8000 +C000 +8100 +E100 +7900 +0480 +0280 +0180 +0280 +0680 +3CC0 +F840 +ENDCHAR +STARTCHAR FEF9 +ENCODING 65273 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 18 1 -4 +BITMAP +8200 +C380 +E100 +6100 +1100 +0A00 +0A00 +0600 +0400 +0600 +1A00 +1E00 +1C00 +0000 +1000 +2000 +1800 +2000 +ENDCHAR +STARTCHAR FEFA +ENCODING 65274 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 16 1 -2 +BITMAP +C000 +F100 +7900 +0500 +0280 +0080 +0180 +0280 +0680 +3CC0 +F840 +0000 +2000 +4000 +6000 +4000 +ENDCHAR +STARTCHAR FEFB +ENCODING 65275 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 1 1 +BITMAP +8200 +C380 +E100 +6100 +1100 +0A00 +0A00 +0600 +0400 +0600 +1A00 +1E00 +1C00 +ENDCHAR +STARTCHAR FEFC +ENCODING 65276 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 11 1 3 +BITMAP +C000 +F100 +7900 +0500 +0280 +0080 +0180 +0280 +0680 +3CC0 +F840 +ENDCHAR +STARTCHAR FFFC +ENCODING 65532 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 19 14 0 0 +BITMAP +E71CE0 +800020 +800020 +000000 +1EF980 +B3C9A0 +A1F1A0 +A1C9A0 +B3C920 +1EFF00 +000000 +800020 +800020 +E71CE0 +ENDCHAR +ENDFONT diff --git a/TMC2209_Motorized_Turntable/code.py b/TMC2209_Motorized_Turntable/code.py new file mode 100644 index 000000000..852dadb2f --- /dev/null +++ b/TMC2209_Motorized_Turntable/code.py @@ -0,0 +1,228 @@ +# SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import asyncio +import board +import displayio +import adafruit_imageload +from digitalio import DigitalInOut, Direction +from adafruit_seesaw import seesaw, rotaryio, digitalio +from adafruit_bitmap_font import bitmap_font +from adafruit_display_text import label +import adafruit_displayio_ssd1306 + +# rotary encoder +i2c = board.STEMMA_I2C() +seesaw = seesaw.Seesaw(i2c, addr=0x36) +encoder = rotaryio.IncrementalEncoder(seesaw) +pos = -encoder.position +last_pos = pos +seesaw.pin_mode(24, seesaw.INPUT_PULLUP) +button = digitalio.DigitalIO(seesaw, 24) +button_state = False + +#display setup +displayio.release_displays() + +# oled +oled_reset = board.D9 +display_bus = displayio.I2CDisplay(i2c, device_address=0x3D, reset=oled_reset) +WIDTH = 128 +HEIGHT = 64 +display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=WIDTH, height=HEIGHT) +# icon sprite sheet +bitmap, palette = adafruit_imageload.load("/icons.bmp", + bitmap=displayio.Bitmap, + palette=displayio.Palette) + +icons_grid = displayio.TileGrid(bitmap, pixel_shader=palette, + tile_height=38, tile_width=38, + x=int((display.width / 2)-(38/2)), y=display.height-38) +# text at top of screen +font = bitmap_font.load_font('/Arial-14.bdf') +main_area = label.Label( + font, text=" ", color=0xFFFFFF) +main_area.anchor_point = (0.5, 0.0) +main_area.anchored_position = (display.width / 2, 0) + +splash = displayio.Group() +splash.append(icons_grid) +splash.append(main_area) +display.root_group = splash + +# direction and step pins +DIR = DigitalInOut(board.D5) +DIR.direction = Direction.OUTPUT +STEP = DigitalInOut(board.D6) +STEP.direction = Direction.OUTPUT + +# enable pin, default off +EN = DigitalInOut(board.D4) +EN.direction = Direction.OUTPUT +EN.value = True + +# stepper pins, default 32 +MS2 = DigitalInOut(board.D3) +MS2.direction = Direction.OUTPUT +MS2.value = True +MS1 = DigitalInOut(board.D2) +MS1.direction = Direction.OUTPUT +MS1.value = False + +# speed dictionaries +speed1 = { + "micro" : 16, + "ms1" : True, + "ms2" : True, + "icon" : 2, + "label" : "FAST" + } +speed2 = { + "micro" : 32, + "ms1" : True, + "ms2" : False, + "icon" : 1, + "label" : "MEDIUM" + } +speed3 = { + "micro" : 64, + "ms1" : False, + "ms2" : True, + "icon" : 0, + "label" : "SLOW" + } +speeds = [speed3, speed2, speed1] + +def change_speed(speed): + MS1.value = speeds[speed]["ms1"] + MS2.value = speeds[speed]["ms2"] + icons_grid[0] = speeds[speed]["icon"] + main_area.text = speeds[speed]["label"] + +# enable dictionaries +on = { + "en" : False, + "icon" : 6, + "label" : "ON" + } + +off = { + "en" : True, + "icon" : 5, + "label" : "OFF" + } + +onDict = [on, off] + +def onOff(go): + EN.value = onDict[go]["en"] + icons_grid[0] = onDict[go]["icon"] + main_area.text = onDict[go]["label"] + +# direction dictionaries +clock = { + "dir" : True, + "icon" : 3, + "label" : "CLOCK" + } +counter = { + "dir" : False, + "icon" : 4, + "label" : "COUNTER" + } + +directions = [clock, counter] + +def changeDirection(direct): + DIR.value = directions[direct]["dir"] + icons_grid[0] = directions[direct]["icon"] + main_area.text = directions[direct]["label"] + +# menu states +states = ["SPEED", "ON/OFF", "DIRECTION", "scroll"] +state_icons = [2, 6, 3] + +class GUI_Attributes: + def __init__(self): + self.menu = 0 + self.index = 0 + self.state = states[3] + self.current_speed = 1 + +async def step(): + while True: + if EN.value is False: + STEP.value = not STEP.value + await asyncio.sleep(0) + +async def read_encoder(p, last_p, choice): + while True: + p = encoder.position + if p != last_p: + if p > last_p: + if choice.state is states[0]: + choice.index = (choice.index + 1) % 3 + change_speed(choice.index) + choice.current_speed = choice.index + if choice.state is states[1]: + choice.index = (choice.index + 1) % 2 + onOff(choice.index) + if choice.state is states[2]: + choice.index = (choice.index + 1) % 2 + changeDirection(choice.index) + if choice.state is states[3]: + choice.menu = (choice.menu + 1) % 3 + main_area.text = states[choice.menu] + icons_grid[0] = state_icons[choice.menu] + else: + if choice.state is states[0]: + choice.index = (choice.index - 1) % 3 + change_speed(choice.index) + choice.current_speed = choice.index + if choice.state is states[1]: + choice.index = (choice.index - 1) % 2 + onOff(choice.index) + if choice.state is states[2]: + choice.index = (choice.index - 1) % 2 + changeDirection(choice.index) + if choice.state is states[3]: + choice.menu = (choice.menu - 1) % 3 + main_area.text = states[choice.menu] + icons_grid[0] = state_icons[choice.menu] + print(choice.menu) + last_p = p + await asyncio.sleep(0.1) + +async def read_button(choice, b_state): + while True: + if not button.value and not b_state: + if choice.state == states[3]: + choice.state = states[choice.menu] + if choice.state == states[0]: + choice.index = choice.current_speed + change_speed(choice.index) + if choice.state == states[1]: + choice.index = EN.value + onOff(choice.index) + if choice.state == states[2]: + choice.index = DIR.value + changeDirection(choice.index) + else: + choice.state = states[3] + main_area.text = states[choice.menu] + b_state = True + if button.value and b_state: + b_state = False + await asyncio.sleep(0.1) + +async def main(): + choice = GUI_Attributes() + step_task = asyncio.create_task(step()) + enc_task = asyncio.create_task(read_encoder(pos, last_pos, choice)) + button_task = asyncio.create_task(read_button(choice, button_state)) + main_area.text = states[choice.menu] + icons_grid[0] = state_icons[choice.menu] + await asyncio.gather(step_task, enc_task, button_task) + +asyncio.run(main()) diff --git a/TMC2209_Motorized_Turntable/icons.bmp b/TMC2209_Motorized_Turntable/icons.bmp new file mode 100644 index 000000000..be1533832 Binary files /dev/null and b/TMC2209_Motorized_Turntable/icons.bmp differ diff --git a/TRRS_Trinkey_Demos/CircuitPython_AT_Demo/code.py b/TRRS_Trinkey_Demos/CircuitPython_AT_Demo/code.py new file mode 100644 index 000000000..ec3ee2287 --- /dev/null +++ b/TRRS_Trinkey_Demos/CircuitPython_AT_Demo/code.py @@ -0,0 +1,76 @@ +# SPDX-FileCopyrightText: 2024 ladyada for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +import digitalio +import usb_hid +from adafruit_hid.keyboard import Keyboard +from adafruit_hid.keycode import Keycode + +# HID Keyboard setup +keyboard = Keyboard(usb_hid.devices) + +# Define pins for switches and grounds +tip_switch = digitalio.DigitalInOut(board.TIP_SWITCH) +tip_switch.direction = digitalio.Direction.INPUT +tip_switch.pull = digitalio.Pull.UP + +sleeve = digitalio.DigitalInOut(board.SLEEVE) +sleeve.direction = digitalio.Direction.OUTPUT +sleeve.value = False + +ring_2 = digitalio.DigitalInOut(board.RING_2) +# Set TIP and RING_1 initially as outputs to low for jack detection +tip = digitalio.DigitalInOut(board.TIP) +tip.direction = digitalio.Direction.OUTPUT +tip.value = False + +ring_1 = digitalio.DigitalInOut(board.RING_1) +ring_1.direction = digitalio.Direction.OUTPUT +ring_1.value = False + +# Track the state of cable insertion +last_cable_state = False + +while True: + # Drive TIP low and check TIP_SWITCH to detect if cable is inserted + tip.direction = digitalio.Direction.OUTPUT + tip.value = False + time.sleep(0.001) # Wait a moment for the state to stabilize + cable_inserted = tip_switch.value # Active low when cable is inserted + + # Handle the detected state change for cable insertion + if cable_inserted and not last_cable_state: + print("inserted!") + time.sleep(0.25) # Debounce and allow time for complete insertion + + last_cable_state = cable_inserted + + if cable_inserted: + # Now configure TIP and RING_1 as inputs with pull-ups + ring_2.direction = digitalio.Direction.OUTPUT + ring_2.value = False + tip.direction = digitalio.Direction.INPUT + tip.pull = digitalio.Pull.UP + sleeve.direction = digitalio.Direction.INPUT + sleeve.pull = digitalio.Pull.UP + + # Check the switches and send keycodes + keycode = [] + if not tip.value: + print("A") + keycode.append(Keycode.A) + if not sleeve.value: + print("B") + keycode.append(Keycode.B) + + if keycode: + keyboard.send(*keycode) + else: + keyboard.release_all() + else: + keyboard.release_all() + + time.sleep(0.01) # Sample at 100 Hz diff --git a/TRRS_Trinkey_Demos/CircuitPython_Analog_Mouse/code.py b/TRRS_Trinkey_Demos/CircuitPython_Analog_Mouse/code.py new file mode 100644 index 000000000..b5561b12f --- /dev/null +++ b/TRRS_Trinkey_Demos/CircuitPython_Analog_Mouse/code.py @@ -0,0 +1,75 @@ +# SPDX-FileCopyrightText: 2024 Bill Binko +# SPDX-License-Identifier: MIT + +import time +import board +import analogio +import digitalio +import usb_hid +from adafruit_hid.mouse import Mouse +# pylint: disable=wildcard-import, line-too-long +#import some settings that are specific to joystick/platform +from settings import * + +#Calculated value from imported settings +centerVert = int((highVert - lowVert)/2.0) +deadVert = abs((highVert - lowVert)*deadPct) + +centerHor = int((highHor - lowHor)/2.0) +deadHor = abs((highHor - lowHor)*deadPct) + +#Create a HID Mouse device +mouse = Mouse(usb_hid.devices) + +#Setup the RING_2 as Ground +ground = digitalio.DigitalInOut(board.RING_2) +ground.direction=digitalio.Direction.OUTPUT +ground.value = False +#And SLEEVE as VCC (3.3V) +vcc = digitalio.DigitalInOut(board.SLEEVE) +vcc.direction=digitalio.Direction.OUTPUT +vcc.value = True + +#setup the switch on the tip to detect a plug being inserted +switch = digitalio.DigitalInOut(board.TIP_SWITCH) +switch.direction=digitalio.Direction.OUTPUT +switch.value=False +#These values shouldn't need changing w/Joystick changes +switchMin = 500 +switchMax = 5000 + +#Two analog inputs for TIP and RING_1 +hor = analogio.AnalogIn(board.TIP) +vert = analogio.AnalogIn(board.RING_1) + +#A convenience cunction similar to Arduino's mapping function +def range_map(value, in_min, in_max, out_min, out_max): + return int(max(out_min,min(out_max,(value - in_min) * (out_max - out_min) // (in_max - in_min) + out_min))) + +#Start Main Loop +while True: + #Check to be sure cord is plugged in + switch.value=False #Start with TIP_SWITCH pulled Low + if hor.value < switchMin: #TIP is pulled Low + switch.value = True #change TIP_SWITCH pin to high + if hor.value > switchMax: #TIP is now pulled High + print("no plug") + time.sleep(.5) #sleep when there's no plug + continue + + #Ok, the switch is inserted, start reading/processing joystick motions + horVal = hor.value + vertVal = vert.value +# print((horVal, vertVal,)) + + #ignore any motions inside the center dead zone (default 10% of full throw) + if abs(centerHor - horVal) > deadHor or abs(centerVert - vertVal) > deadVert: + #map X and Y to the analog inputs (settings.py sets these values) + mouse_x = range_map(horVal, lowHor, highHor, -maxMouseMove, maxMouseMove) + mouse_y = range_map(vertVal, lowVert, highVert, -maxMouseMove, maxMouseMove) + + if mouse_x != 0 or mouse_y != 0: #don't bother moving if both 0 + mouse.move(invertHor * mouse_x, invertVert * mouse_y) + + #wait a bit to not flood the USB port + time.sleep(0.025) diff --git a/TRRS_Trinkey_Demos/CircuitPython_Analog_Mouse/settings.py b/TRRS_Trinkey_Demos/CircuitPython_Analog_Mouse/settings.py new file mode 100644 index 000000000..49b85814b --- /dev/null +++ b/TRRS_Trinkey_Demos/CircuitPython_Analog_Mouse/settings.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: 2024 Bill Binko +# SPDX-License-Identifier: MIT + +#Customizable per Analog Joystick - these are good for Adafruit Thumbsticks to start +#How big the "dead zone" is in the center of the joystick +deadPct = .10 + +#Vertical limits +#Reading at "down" +lowVert = 0 +#"up" +highVert = 65000 +#set to -1 to invert the vertical axis +invertVert = -1 + +#Horizontal limits +lowHor= 0 +highHor = 65000 +#set to -1 to invert the horizontal axis +invertHor = 1 + +#How much to move a mouse a full-throw +#(10 works well on a PC, and 2 is good for iOS AssitiveTouch) +maxMouseMove=8 diff --git a/TRRS_Trinkey_Demos/CircuitPython_Chording_Joystick/XACsettings.py b/TRRS_Trinkey_Demos/CircuitPython_Chording_Joystick/XACsettings.py new file mode 100644 index 000000000..1a4a06cb8 --- /dev/null +++ b/TRRS_Trinkey_Demos/CircuitPython_Chording_Joystick/XACsettings.py @@ -0,0 +1,15 @@ +# SPDX-FileCopyrightText: 2024 Bill Binko +# SPDX-License-Identifier: MIT + +#Change this to True to swap horizonatal and vertical axes +swapAxes = False + +#Change this to True to invert (flip) the horizontal axis +invertHor = False + +#Change this to True to invert (flip) the vertical axis +invertVert = True + +#Increase this to make the motion smoother (with more lag) +#Decrease to make more responsive (Min=1 Default=3 Max=Any but>20 is unreasonable) +smoothingFactor = 2 diff --git a/TRRS_Trinkey_Demos/CircuitPython_Chording_Joystick/boot.py b/TRRS_Trinkey_Demos/CircuitPython_Chording_Joystick/boot.py new file mode 100644 index 000000000..a8bf8b24f --- /dev/null +++ b/TRRS_Trinkey_Demos/CircuitPython_Chording_Joystick/boot.py @@ -0,0 +1,75 @@ +# SPDX-FileCopyrightText: 2024 Bill Binko +# SPDX-License-Identifier: MIT + +import usb_midi +import usb_hid + +print("In boot.py") + +# storage.disable_usb_device() + +# usb_cdc.enable(console=True, data=True) + +usb_midi.disable() +xac_descriptor=bytes( + # This descriptor mimics the simple joystick from PDP that the XBox likes + ( + 0x05, + 0x01, # Usage Page (Desktop), + 0x09, + 0x05, # Usage (Gamepad), + 0xA1, + 0x01, # Collection (Application), + ) + + ((0x85, 0x04) ) #report id + + ( + 0x15, + 0x00, # Logical Minimum (0), + 0x25, + 0x01, # Logical Maximum (1), + 0x35, + 0x00, # Physical Minimum (0), + 0x45, + 0x01, # Physical Maximum (1), + 0x75, + 0x01, # Report Size (1), + 0x95, + 0x08, # Report Count (8), + 0x05, + 0x09, # Usage Page (Button), + 0x19, + 0x01, # Usage Minimum (01h), + 0x29, + 0x08, # Usage Maximum (08h), + 0x81, + 0x02, # Input (Variable), + 0x05, + 0x01, # Usage Page (Desktop), + 0x26, + 0xFF, + 0x00, # Logical Maximum (255), + 0x46, + 0xFF, + 0x00, # Physical Maximum (255), + 0x09, + 0x30, # Usage (X), + 0x09, + 0x31, # Usage (Y), + 0x75, + 0x08, # Report Size (8), + 0x95, + 0x02, # Report Count (2), + 0x81, + 0x02, # Input (Variable), + 0xC0, # End Collection + )) +# pylint: disable=missing-kwoa +my_gamepad = usb_hid.Device( + report_descriptor=xac_descriptor, + usage_page=1, + usage=5, + report_ids=(4,), + in_report_lengths=(3,), + out_report_lengths=(0,),) +print("Enabling XAC Gamepad") +usb_hid.enable((my_gamepad,)) diff --git a/TRRS_Trinkey_Demos/CircuitPython_Chording_Joystick/code.py b/TRRS_Trinkey_Demos/CircuitPython_Chording_Joystick/code.py new file mode 100644 index 000000000..384c3c002 --- /dev/null +++ b/TRRS_Trinkey_Demos/CircuitPython_Chording_Joystick/code.py @@ -0,0 +1,124 @@ +# SPDX-FileCopyrightText: 2024 Bill Binko +# SPDX-License-Identifier: MIT + +import time +import array +import board +import digitalio +import keypad +#Custom version of Gamepad compatible w/the XBox Adaptive Controller (XAC) +import xac_gamepad +# pylint: disable=wildcard-import, unused-wildcard-import +from XACsettings import * + +#Use Keypad library to read buttons wired between ground and Tip/Ring1 +keys = keypad.Keys((board.TIP,board.RING_1), value_when_pressed=False, pull=True) + +time.sleep(1.0) +gp = xac_gamepad.XACGamepad() + +class RollingAverage: + def __init__(self, size): + self.size=size + self.buffer = array.array('d') + for _ in range(size): + self.buffer.append(0.0) + self.pos = 0 + def addValue(self,val): + self.buffer[self.pos] = val + self.pos = (self.pos + 1) % self.size + def average(self): + return sum(self.buffer) / self.size + +ground = digitalio.DigitalInOut(board.RING_2) +ground.direction=digitalio.Direction.OUTPUT +ground.value = False + +ground2 = digitalio.DigitalInOut(board.SLEEVE) +ground2.direction=digitalio.Direction.OUTPUT +ground2.value = False + + +#Our joystick goes from 0-255 with a center at 128 +FORWARD = 0 +REVERSE=255 +CENTER=128 +LEFT=0 +RIGHT=255 + +#These two are how much we should smooth the joystick - higher numbers smooth more but add lag +VERT_AVG_COUNT=8 +HOR_AVG_COUNT=8 +#We need two Rolling Average Objects to smooth our values +xAvg = RollingAverage(HOR_AVG_COUNT) +yAvg = RollingAverage(VERT_AVG_COUNT) + +gp.reset_all() + +#Set Initial State variables +leftDown=False +rightDown=False +movingForward = False +joyChanged=False + +#main loop - read switches and set joystick output +while True: + event=keys.events.get() + #Calculate the rolling average for the X and Y + lastXAvg = xAvg.average() + lastYAvg = yAvg.average() + if event: + if event.pressed: + if event.key_number==0: + leftDown=True + elif event.key_number==1: + rightDown=True + else: + if event.key_number==0: + leftDown=False + elif event.key_number==1: + rightDown=False + + #At this point, we know whether we need to move the joystick + #Start with the assumption that we're in the center. + x=CENTER + y=CENTER + #If BOTH are down, we are always moving North + if leftDown and rightDown: + movingForward = True + x=CENTER + y=FORWARD + #Simlarly, if neither or down we are stopped + elif not leftDown and not rightDown: + movingForward = False + x=CENTER + y=CENTER + #Otherwise our direction depends on whether we WERE movingForward last iteration + elif movingForward: + #If So, we are moving NorthWest or NorthEast + if leftDown: + x=LEFT + y=FORWARD + elif rightDown: + x=RIGHT + y=FORWARD + else: + #If not, we are moving West or East + if leftDown: + x=LEFT + y=CENTER + elif rightDown: + x=RIGHT + y=CENTER + #We know x and y, so do some smoothing + xAvg.addValue(x) + yAvg.addValue(y) + #We need to send integers so calculate the average and truncate it + newX = int(xAvg.average()) + newY = int(yAvg.average()) + #We only call move_joysticks if one of the values has changed from last time + if (newX != lastXAvg or newY != lastYAvg): + gp.move_joysticks(x=newX,y=newY) + print((newX, newY,)) + #Sleep to avoid overwhelming the XAC + time.sleep(0.05) diff --git a/TRRS_Trinkey_Demos/CircuitPython_Chording_Joystick/xac_gamepad.py b/TRRS_Trinkey_Demos/CircuitPython_Chording_Joystick/xac_gamepad.py new file mode 100644 index 000000000..3d1cb97d9 --- /dev/null +++ b/TRRS_Trinkey_Demos/CircuitPython_Chording_Joystick/xac_gamepad.py @@ -0,0 +1,168 @@ +# SPDX-FileCopyrightText: 2024 Bill Binko +# SPDX-License-Identifier: MIT + +# The MIT License (MIT) +# +# Copyright (c) 2018 Dan Halbert for Adafruit Industries +# +# 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 THE +# AUTHORS OR COPYRIGHT HOLDERS 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. +# + +""" +`adafruit_hid.gamepad.Gamepad` +==================================================== + +* Author(s): Dan Halbert +""" + +import sys +if sys.implementation.version[0] < 3: + raise ImportError('{0} is not supported in CircuitPython 2.x or lower'.format(__name__)) + +# pylint: disable=wrong-import-position +import struct +import time +import usb_hid + +class XACGamepad: + """Emulate a generic gamepad controller with 8 buttons, + numbered 1-8 and one joysticks, controlling + ``x` and ``y`` values + + The joystick values could be interpreted + differently by the receiving program: those are just the names used here. + The joystick values are in the range 0 to 255. +""" + + def __init__(self): + """Create a Gamepad object that will send USB gamepad HID reports.""" + self._hid_gamepad = None + for device in usb_hid.devices: + print(device) + if device.usage_page == 0x1 and device.usage == 0x05: + self._hid_gamepad = device + break + if not self._hid_gamepad: + raise OSError("Could not find an HID gamepad device.") + + # Reuse this bytearray to send mouse reports. + # Typically controllers start numbering buttons at 1 rather than 0. + # report[0] buttons 1-8 (LSB is button 1) + # report[1] joystick 0 x: 0 to 255 + # report[2] joystick 0 y: 0 to 255 + self._report = bytearray(3) + + # Remember the last report as well, so we can avoid sending + # duplicate reports. + self._last_report = bytearray(3) + + # Store settings separately before putting into report. Saves code + # especially for buttons. + self._buttons_state = 0 + self._joy_x = 0 + self._joy_y = 0 + + # Send an initial report to test if HID device is ready. + # If not, wait a bit and try once more. + try: + self.reset_all() + except OSError: + time.sleep(1) + self.reset_all() + + def press_buttons(self, *buttons): + """Press and hold the given buttons. """ + for button in buttons: + self._buttons_state |= 1 << self._validate_button_number(button) - 1 + self._send() + + def release_buttons(self, *buttons): + """Release the given buttons. """ + for button in buttons: + self._buttons_state &= ~(1 << self._validate_button_number(button) - 1) + self._send() + + def release_all_buttons(self): + """Release all the buttons.""" + + self._buttons_state = 0 + self._send() + + def click_buttons(self, *buttons): + """Press and release the given buttons.""" + self.press_buttons(*buttons) + self.release_buttons(*buttons) + + def move_joysticks(self, x=None, y=None): + """Set and send the given joystick values. + The joysticks will remain set with the given values until changed + + One joystick provides ``x`` and ``y`` values, + and the other provides ``z`` and ``r_z`` (z rotation). + Any values left as ``None`` will not be changed. + + All values must be in the range 0 to 255 inclusive. + + Examples:: + + # Change x and y values only. + gp.move_joysticks(x=100, y=-50) + + # Reset all joystick values to center position. + gp.move_joysticks(0, 0, 0, 0) + """ + if x is not None: + self._joy_x = self._validate_joystick_value(x) + if y is not None: + self._joy_y = self._validate_joystick_value(y) + self._send() + + def reset_all(self): + """Release all buttons and set joysticks to zero.""" + self._buttons_state = 0 + self._joy_x = 128 + self._joy_y = 128 + self._send(always=True) + + def _send(self, always=False): + """Send a report with all the existing settings. + If ``always`` is ``False`` (the default), send only if there have been changes. + """ + + struct.pack_into('20 is unreasonable) +smoothingFactor = 2 diff --git a/TRRS_Trinkey_Demos/XAC_Joystick/boot.py b/TRRS_Trinkey_Demos/XAC_Joystick/boot.py new file mode 100644 index 000000000..a8bf8b24f --- /dev/null +++ b/TRRS_Trinkey_Demos/XAC_Joystick/boot.py @@ -0,0 +1,75 @@ +# SPDX-FileCopyrightText: 2024 Bill Binko +# SPDX-License-Identifier: MIT + +import usb_midi +import usb_hid + +print("In boot.py") + +# storage.disable_usb_device() + +# usb_cdc.enable(console=True, data=True) + +usb_midi.disable() +xac_descriptor=bytes( + # This descriptor mimics the simple joystick from PDP that the XBox likes + ( + 0x05, + 0x01, # Usage Page (Desktop), + 0x09, + 0x05, # Usage (Gamepad), + 0xA1, + 0x01, # Collection (Application), + ) + + ((0x85, 0x04) ) #report id + + ( + 0x15, + 0x00, # Logical Minimum (0), + 0x25, + 0x01, # Logical Maximum (1), + 0x35, + 0x00, # Physical Minimum (0), + 0x45, + 0x01, # Physical Maximum (1), + 0x75, + 0x01, # Report Size (1), + 0x95, + 0x08, # Report Count (8), + 0x05, + 0x09, # Usage Page (Button), + 0x19, + 0x01, # Usage Minimum (01h), + 0x29, + 0x08, # Usage Maximum (08h), + 0x81, + 0x02, # Input (Variable), + 0x05, + 0x01, # Usage Page (Desktop), + 0x26, + 0xFF, + 0x00, # Logical Maximum (255), + 0x46, + 0xFF, + 0x00, # Physical Maximum (255), + 0x09, + 0x30, # Usage (X), + 0x09, + 0x31, # Usage (Y), + 0x75, + 0x08, # Report Size (8), + 0x95, + 0x02, # Report Count (2), + 0x81, + 0x02, # Input (Variable), + 0xC0, # End Collection + )) +# pylint: disable=missing-kwoa +my_gamepad = usb_hid.Device( + report_descriptor=xac_descriptor, + usage_page=1, + usage=5, + report_ids=(4,), + in_report_lengths=(3,), + out_report_lengths=(0,),) +print("Enabling XAC Gamepad") +usb_hid.enable((my_gamepad,)) diff --git a/TRRS_Trinkey_Demos/XAC_Joystick/code.py b/TRRS_Trinkey_Demos/XAC_Joystick/code.py new file mode 100644 index 000000000..d368741ce --- /dev/null +++ b/TRRS_Trinkey_Demos/XAC_Joystick/code.py @@ -0,0 +1,90 @@ +# SPDX-FileCopyrightText: 2024 by John Park for Adafruit Industries +# +# SPDX-License-Identifier: MIT +# adapted from Bill Binko's Chording Switches code +''' +Xbox Adaptive Controller USB port joystick +Use a two axis joystick, or combo of pots, soft pots, etc. +wired to TRRS 3.mm plug: + Tip = X + Ring 1 = Y + Ring 2 = GND + Sleeve = VCC +''' +import time +import array +import board +import analogio +import digitalio +#Custom version of Gamepad compatible w/the XBox Adaptive Controller (XAC) +import xac_gamepad +# pylint: disable=wildcard-import, unused-wildcard-import +from XACsettings import * + +time.sleep(1.0) +gp = xac_gamepad.XACGamepad() + +class RollingAverage: + def __init__(self, size): + self.size=size + # pylint: disable=c-extension-no-member + self.buffer = array.array('d') + for _ in range(size): + self.buffer.append(0.0) + self.pos = 0 + def addValue(self,val): + self.buffer[self.pos] = val + self.pos = (self.pos + 1) % self.size + def average(self): + return sum(self.buffer) / self.size + +# Two analog inputs for TIP and RING_1 +hor = analogio.AnalogIn(board.TIP) +vert = analogio.AnalogIn(board.RING_1) + +# RING_2 as ground +ground = digitalio.DigitalInOut(board.RING_2) +ground.direction=digitalio.Direction.OUTPUT +ground.value = False + +# SLEEVE as VCC (3.3V) +vcc = digitalio.DigitalInOut(board.SLEEVE) +vcc.direction=digitalio.Direction.OUTPUT +vcc.value = True + +def range_map(value, in_min, in_max, out_min, out_max): + # pylint: disable=line-too-long + return int(max(out_min,min(out_max,(value - in_min) * (out_max - out_min) // (in_max - in_min) + out_min))) + +# These two are how much we should smooth the joystick - higher numbers smooth more but add lag +VERT_AVG_COUNT=3 +HOR_AVG_COUNT=3 +#We need two Rolling Average Objects to smooth our values +xAvg = RollingAverage(HOR_AVG_COUNT) +yAvg = RollingAverage(VERT_AVG_COUNT) + +gp.reset_all() + + +while True: + x = range_map(hor.value, 540, 65000, 0, 255) + y = range_map(vert.value, 65000, 540, 0, 255) + + #Calculate the rolling average for the X and Y + lastXAvg = xAvg.average() + lastYAvg = yAvg.average() + + #We know x and y, so do some smoothing + xAvg.addValue(x) + yAvg.addValue(y) + #We need to send integers so calculate the average and truncate it + newX = int(xAvg.average()) + newY = int(yAvg.average()) + + #We only call move_joysticks if one of the values has changed from last time + if (newX != lastXAvg or newY != lastYAvg): + gp.move_joysticks(x=newX,y=newY) + # print(hor.value, vert.value) # print debug raw values + # print((newX, newY,)) # print debug remapped, averaged values + #Sleep to avoid overwhelming the XAC + time.sleep(0.05) diff --git a/TRRS_Trinkey_Demos/XAC_Joystick/xac_gamepad.py b/TRRS_Trinkey_Demos/XAC_Joystick/xac_gamepad.py new file mode 100644 index 000000000..3d1cb97d9 --- /dev/null +++ b/TRRS_Trinkey_Demos/XAC_Joystick/xac_gamepad.py @@ -0,0 +1,168 @@ +# SPDX-FileCopyrightText: 2024 Bill Binko +# SPDX-License-Identifier: MIT + +# The MIT License (MIT) +# +# Copyright (c) 2018 Dan Halbert for Adafruit Industries +# +# 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 THE +# AUTHORS OR COPYRIGHT HOLDERS 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. +# + +""" +`adafruit_hid.gamepad.Gamepad` +==================================================== + +* Author(s): Dan Halbert +""" + +import sys +if sys.implementation.version[0] < 3: + raise ImportError('{0} is not supported in CircuitPython 2.x or lower'.format(__name__)) + +# pylint: disable=wrong-import-position +import struct +import time +import usb_hid + +class XACGamepad: + """Emulate a generic gamepad controller with 8 buttons, + numbered 1-8 and one joysticks, controlling + ``x` and ``y`` values + + The joystick values could be interpreted + differently by the receiving program: those are just the names used here. + The joystick values are in the range 0 to 255. +""" + + def __init__(self): + """Create a Gamepad object that will send USB gamepad HID reports.""" + self._hid_gamepad = None + for device in usb_hid.devices: + print(device) + if device.usage_page == 0x1 and device.usage == 0x05: + self._hid_gamepad = device + break + if not self._hid_gamepad: + raise OSError("Could not find an HID gamepad device.") + + # Reuse this bytearray to send mouse reports. + # Typically controllers start numbering buttons at 1 rather than 0. + # report[0] buttons 1-8 (LSB is button 1) + # report[1] joystick 0 x: 0 to 255 + # report[2] joystick 0 y: 0 to 255 + self._report = bytearray(3) + + # Remember the last report as well, so we can avoid sending + # duplicate reports. + self._last_report = bytearray(3) + + # Store settings separately before putting into report. Saves code + # especially for buttons. + self._buttons_state = 0 + self._joy_x = 0 + self._joy_y = 0 + + # Send an initial report to test if HID device is ready. + # If not, wait a bit and try once more. + try: + self.reset_all() + except OSError: + time.sleep(1) + self.reset_all() + + def press_buttons(self, *buttons): + """Press and hold the given buttons. """ + for button in buttons: + self._buttons_state |= 1 << self._validate_button_number(button) - 1 + self._send() + + def release_buttons(self, *buttons): + """Release the given buttons. """ + for button in buttons: + self._buttons_state &= ~(1 << self._validate_button_number(button) - 1) + self._send() + + def release_all_buttons(self): + """Release all the buttons.""" + + self._buttons_state = 0 + self._send() + + def click_buttons(self, *buttons): + """Press and release the given buttons.""" + self.press_buttons(*buttons) + self.release_buttons(*buttons) + + def move_joysticks(self, x=None, y=None): + """Set and send the given joystick values. + The joysticks will remain set with the given values until changed + + One joystick provides ``x`` and ``y`` values, + and the other provides ``z`` and ``r_z`` (z rotation). + Any values left as ``None`` will not be changed. + + All values must be in the range 0 to 255 inclusive. + + Examples:: + + # Change x and y values only. + gp.move_joysticks(x=100, y=-50) + + # Reset all joystick values to center position. + gp.move_joysticks(0, 0, 0, 0) + """ + if x is not None: + self._joy_x = self._validate_joystick_value(x) + if y is not None: + self._joy_y = self._validate_joystick_value(y) + self._send() + + def reset_all(self): + """Release all buttons and set joysticks to zero.""" + self._buttons_state = 0 + self._joy_x = 128 + self._joy_y = 128 + self._send(always=True) + + def _send(self, always=False): + """Send a report with all the existing settings. + If ``always`` is ``False`` (the default), send only if there have been changes. + """ + + struct.pack_into(' + +#define IROUT 9 +#define IRIN 2 + +volatile unsigned long pulseCount = 0; + +#if defined(ARDUINO_RASPBERRY_PI_PICO) +#include "hardware/pwm.h" +void countPulse() { + pulseCount++; +} +#else +void countPulse() { + pulseCount++; +} +#endif + +void setup() { + Serial.begin(115200); + pinMode(IRIN, INPUT); // Assuming the input signal is connected to pin 2 + + attachInterrupt(digitalPinToInterrupt(IRIN), countPulse, RISING); + pinMode(IROUT, OUTPUT); + +} + +bool testFreq(uint32_t freq) { + uint32_t temp = 0; + + Serial.print(freq); Serial.println(" Hz"); + setFrequency(freq); // Set the initial frequency to the specified value + pulseCount = 0; + delay(100); + temp = pulseCount; + Serial.print("\tCounted "); Serial.print(temp); + Serial.println(" pulses"); + if ((temp > (freq / 10) + (freq / 100)) || (temp < (freq / 10) - (freq / 100))) { + return false; + } + return true; +} + +void loop() { + Serial.println("----------------------"); + if (!testFreq(30000)) return; + if (!testFreq(40000)) return; + if (!testFreq(50000)) return; + if (!testFreq(60000)) return; + +} + +void setFrequency(unsigned long frequency) { +#if defined(__AVR__) + unsigned long ocrValue; + byte csBits = 0; + + // Disable interrupts + noInterrupts(); + + // Reset Timer1 Control Registers + TCCR1A = 0; + TCCR1B = 0; + TCNT1 = 0; // Reset counter + + // Set Timer1 to CTC mode (Clear Timer on Compare Match) + TCCR1B |= (1 << WGM12); + + // Determine best prescaler and OCR1A value for the desired frequency + if (frequency > 4000) { // Can use no prescaler if frequency is high enough + csBits = (1 << CS10); // No prescaler + ocrValue = 16000000 / (2 * frequency) - 1; + } else if (frequency > 500) { + csBits = (1 << CS11); // Prescaler 8 + ocrValue = 2000000 / (2 * frequency) - 1; + } else if (frequency > 60) { + csBits = (1 << CS11) | (1 << CS10); // Prescaler 64 + ocrValue = 250000 / (2 * frequency) - 1; + } else { + csBits = (1 << CS12); // Prescaler 256 + ocrValue = 62500 / (2 * frequency) - 1; + } + + // Handle boundary conditions for OCR1A + if (ocrValue > 65535) ocrValue = 65535; // Cap at maximum for 16-bit timer + if (ocrValue < 1) ocrValue = 1; // Ensure OCR1A is at least 1 + + OCR1A = ocrValue; + TCCR1B |= csBits; // Set the prescaler + TCCR1A |= (1 << COM1A0); // Toggle OC1A on Compare Match + + // Re-enable interrupts + interrupts(); + +#elif defined(ARDUINO_RASPBERRY_PI_PICO) + // Set PWM frequency for the RP2040 + gpio_set_function(IROUT, GPIO_FUNC_PWM); + uint slice_num = pwm_gpio_to_slice_num(IROUT); + pwm_set_wrap(slice_num, 125000000 / frequency); + pwm_set_chan_level(slice_num, PWM_CHAN_A, 125000000 / (2 * frequency)); + pwm_set_enabled(slice_num, true); + +#endif +} diff --git a/Tilemap_Game_With_CircuitPython/requirements.txt b/Tilemap_Game_With_CircuitPython/requirements.txt index d6212a759..7a5d20bca 100644 --- a/Tilemap_Game_With_CircuitPython/requirements.txt +++ b/Tilemap_Game_With_CircuitPython/requirements.txt @@ -1,2 +1,2 @@ -adafruit_display_text -adafruit_imageload +adafruit-circuitpython-display-text +adafruit-circuitpython-imageload diff --git a/Toddler_Timer/Arial-14.bdf b/Toddler_Timer/Arial-14.bdf new file mode 100644 index 000000000..a92736e1a --- /dev/null +++ b/Toddler_Timer/Arial-14.bdf @@ -0,0 +1,27566 @@ +STARTFONT 2.1 +COMMENT +COMMENT Converted from OpenType font "arial.ttf" by "otf2bdf 3.0". +COMMENT +FONT -FreeType-Arial-Medium-R-Normal--19-140-100-100-P-94-ISO10646-1 +SIZE 14 100 100 +FONTBOUNDINGBOX 34 26 -13 -6 +STARTPROPERTIES 19 +FOUNDRY "FreeType" +FAMILY_NAME "Arial" +WEIGHT_NAME "Medium" +SLANT "R" +SETWIDTH_NAME "Normal" +ADD_STYLE_NAME "" +PIXEL_SIZE 19 +POINT_SIZE 140 +RESOLUTION_X 100 +RESOLUTION_Y 100 +SPACING "P" +AVERAGE_WIDTH 94 +CHARSET_REGISTRY "ISO10646" +CHARSET_ENCODING "1" +FONT_ASCENT 17 +FONT_DESCENT 4 +COPYRIGHT "Typeface © The Monotype Corporation plc. Data © The Monotype Corporation plc/Type Solutions Inc. 1990-1992. All Rights Reserved" +_OTF_FONTFILE "arial.ttf" +_OTF_PSNAME "ArialMT" +ENDPROPERTIES +CHARS 1419 +STARTCHAR 0020 +ENCODING 32 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 0021 +ENCODING 33 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +80 +00 +C0 +C0 +ENDCHAR +STARTCHAR 0022 +ENCODING 34 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 5 1 9 +BITMAP +D8 +D8 +D8 +D8 +90 +ENDCHAR +STARTCHAR 0023 +ENCODING 35 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0880 +0880 +1880 +FFC0 +FFC0 +1100 +3100 +3100 +FFC0 +FFC0 +2200 +6200 +6200 +4600 +ENDCHAR +STARTCHAR 0024 +ENCODING 36 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -2 +BITMAP +0800 +3E00 +7F00 +CB00 +C800 +C800 +7800 +3E00 +0F00 +0900 +0980 +C980 +CB00 +7F00 +3E00 +0800 +0800 +ENDCHAR +STARTCHAR 0025 +ENCODING 37 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +7830 +4C20 +CC40 +CC40 +CC80 +4880 +7900 +0338 +0264 +0646 +0446 +0C46 +0864 +1838 +ENDCHAR +STARTCHAR 0026 +ENCODING 38 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1E00 +3F00 +3300 +2300 +3300 +1E00 +3C00 +7C00 +C6C0 +C3C0 +C180 +E3C0 +7FE0 +3C60 +ENDCHAR +STARTCHAR 0027 +ENCODING 39 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +C0 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR 0028 +ENCODING 40 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 18 1 -4 +BITMAP +10 +30 +20 +60 +60 +40 +C0 +C0 +C0 +C0 +C0 +C0 +40 +60 +60 +20 +30 +10 +ENDCHAR +STARTCHAR 0029 +ENCODING 41 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 18 1 -4 +BITMAP +C0 +40 +60 +20 +30 +10 +10 +18 +18 +18 +18 +10 +10 +30 +20 +60 +40 +C0 +ENDCHAR +STARTCHAR 002A +ENCODING 42 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 6 1 8 +BITMAP +20 +20 +FC +30 +50 +48 +ENDCHAR +STARTCHAR 002B +ENCODING 43 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 1 +BITMAP +0800 +0800 +0800 +0800 +FF80 +FF80 +0800 +0800 +0800 +0800 +ENDCHAR +STARTCHAR 002C +ENCODING 44 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 5 2 -3 +BITMAP +C0 +C0 +40 +80 +80 +ENDCHAR +STARTCHAR 002D +ENCODING 45 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 2 1 4 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR 002E +ENCODING 46 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 2 2 0 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 002F +ENCODING 47 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +08 +08 +18 +10 +10 +30 +20 +20 +20 +60 +40 +40 +C0 +80 +ENDCHAR +STARTCHAR 0030 +ENCODING 48 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +6300 +C300 +C100 +C180 +C180 +C180 +C180 +C100 +C300 +E300 +7E00 +3C00 +ENDCHAR +STARTCHAR 0031 +ENCODING 49 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 5 14 2 0 +BITMAP +08 +18 +38 +F8 +98 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 0032 +ENCODING 50 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3E00 +7F00 +C300 +C180 +0180 +0300 +0300 +0600 +1C00 +3800 +6000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 0033 +ENCODING 51 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +C300 +C300 +0300 +1E00 +1F00 +0300 +0180 +0180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0034 +ENCODING 52 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0300 +0700 +0700 +0F00 +1B00 +1300 +3300 +6300 +4300 +FFC0 +FFC0 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 0035 +ENCODING 53 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +7F00 +7F00 +6000 +4000 +4000 +DE00 +FF00 +C300 +0180 +0180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0036 +ENCODING 54 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3E00 +7F00 +6300 +C100 +C000 +9E00 +BF00 +E300 +C180 +C180 +C180 +E300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0037 +ENCODING 55 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +FF80 +FF80 +0300 +0600 +0600 +0C00 +0C00 +1800 +1800 +1000 +3000 +3000 +3000 +3000 +ENDCHAR +STARTCHAR 0038 +ENCODING 56 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +6300 +C300 +C300 +6300 +3E00 +7E00 +C300 +C180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 0039 +ENCODING 57 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +E300 +C100 +C180 +C180 +C380 +7F80 +3D80 +0180 +C300 +C300 +7E00 +3C00 +ENDCHAR +STARTCHAR 003A +ENCODING 58 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 10 2 0 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR 003B +ENCODING 59 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 13 2 -3 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +40 +80 +80 +ENDCHAR +STARTCHAR 003C +ENCODING 60 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 2 +BITMAP +0080 +0380 +1F00 +7800 +C000 +7800 +1F00 +0380 +0080 +ENDCHAR +STARTCHAR 003D +ENCODING 61 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 6 1 4 +BITMAP +FF80 +FF80 +0000 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR 003E +ENCODING 62 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 2 +BITMAP +8000 +E000 +7C00 +0F00 +0180 +0F00 +7C00 +E000 +8000 +ENDCHAR +STARTCHAR 003F +ENCODING 63 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3E00 +7F00 +C300 +C180 +0180 +0300 +0600 +0C00 +0C00 +1800 +1800 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 0040 +ENCODING 64 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 18 1 -4 +BITMAP +03F000 +0FFC00 +1C0E00 +300300 +61D980 +47F980 +C63880 +CC1080 +8C1080 +883180 +883100 +CC7700 +CFFE00 +67BC00 +700180 +3C0700 +1FFE00 +03F800 +ENDCHAR +STARTCHAR 0041 +ENCODING 65 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0042 +ENCODING 66 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF00 +FF80 +C0C0 +C0C0 +C0C0 +C0C0 +FF80 +FF80 +C0C0 +C060 +C060 +C0C0 +FFC0 +FF80 +ENDCHAR +STARTCHAR 0043 +ENCODING 67 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 0044 +ENCODING 68 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +FF00 +FFC0 +C0E0 +C060 +C020 +C030 +C030 +C030 +C030 +C060 +C060 +C0E0 +FFC0 +FF00 +ENDCHAR +STARTCHAR 0045 +ENCODING 69 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0046 +ENCODING 70 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 9 14 2 0 +BITMAP +FF80 +FF80 +8000 +8000 +8000 +8000 +FF00 +FF00 +8000 +8000 +8000 +8000 +8000 +8000 +ENDCHAR +STARTCHAR 0047 +ENCODING 71 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 0048 +ENCODING 72 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 0049 +ENCODING 73 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 004A +ENCODING 74 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 14 1 0 +BITMAP +06 +06 +06 +06 +06 +06 +06 +06 +06 +06 +86 +C6 +FC +78 +ENDCHAR +STARTCHAR 004B +ENCODING 75 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +FC00 +F600 +E700 +C300 +C180 +C0C0 +C0E0 +C060 +ENDCHAR +STARTCHAR 004C +ENCODING 76 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 004D +ENCODING 77 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 14 1 0 +BITMAP +E018 +F038 +F028 +D028 +D868 +D868 +C848 +CCC8 +CCC8 +C488 +C788 +C788 +C308 +C308 +ENDCHAR +STARTCHAR 004E +ENCODING 78 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 004F +ENCODING 79 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 0050 +ENCODING 80 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF80 +FFC0 +C0E0 +C060 +C060 +C060 +C0C0 +FFC0 +FF80 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0051 +ENCODING 81 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 15 1 -1 +BITMAP +0F80 +3FE0 +7070 +6030 +C038 +C018 +C018 +C018 +C018 +C030 +61B0 +70E0 +3FE0 +0FB8 +0008 +ENDCHAR +STARTCHAR 0052 +ENCODING 82 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +FFC0 +FFE0 +C060 +C060 +C060 +C060 +FFE0 +FF80 +C300 +C180 +C0C0 +C060 +C060 +C030 +ENDCHAR +STARTCHAR 0053 +ENCODING 83 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0054 +ENCODING 84 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0055 +ENCODING 85 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0056 +ENCODING 86 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +C010 +6030 +6030 +6060 +3060 +3040 +10C0 +18C0 +1880 +0980 +0D80 +0D00 +0700 +0600 +ENDCHAR +STARTCHAR 0057 +ENCODING 87 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 14 0 0 +BITMAP +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 0058 +ENCODING 88 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +6030 +3060 +30C0 +18C0 +0D80 +0F00 +0700 +0700 +0D80 +1980 +18C0 +3060 +6070 +E030 +ENDCHAR +STARTCHAR 0059 +ENCODING 89 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 005A +ENCODING 90 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 005B +ENCODING 91 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 18 1 -4 +BITMAP +F0 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +F0 +F0 +ENDCHAR +STARTCHAR 005C +ENCODING 92 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +80 +C0 +40 +40 +60 +20 +20 +20 +30 +10 +10 +18 +08 +08 +ENDCHAR +STARTCHAR 005D +ENCODING 93 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 18 0 -4 +BITMAP +F0 +F0 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +F0 +ENDCHAR +STARTCHAR 005E +ENCODING 94 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 7 1 7 +BITMAP +10 +38 +28 +6C +44 +C6 +82 +ENDCHAR +STARTCHAR 005F +ENCODING 95 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 2 0 -4 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0060 +ENCODING 96 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 3 1 11 +BITMAP +C0 +60 +20 +ENDCHAR +STARTCHAR 0061 +ENCODING 97 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 0062 +ENCODING 98 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DC00 +ENDCHAR +STARTCHAR 0063 +ENCODING 99 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 0064 +ENCODING 100 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +01 +01 +01 +01 +39 +7D +C3 +C3 +81 +81 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 0065 +ENCODING 101 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0066 +ENCODING 102 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 14 0 0 +BITMAP +1C +3C +20 +20 +F8 +F8 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0067 +ENCODING 103 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +01 +C3 +FE +7C +ENDCHAR +STARTCHAR 0068 +ENCODING 104 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 0069 +ENCODING 105 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 006A +ENCODING 106 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 18 -1 -4 +BITMAP +30 +30 +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 006B +ENCODING 107 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +C7 +CE +DC +F8 +F8 +D8 +CC +C6 +C6 +C3 +ENDCHAR +STARTCHAR 006C +ENCODING 108 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 006D +ENCODING 109 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 10 1 0 +BITMAP +DC70 +FEF8 +E38C +C30C +C30C +C30C +C30C +C30C +C30C +C30C +ENDCHAR +STARTCHAR 006E +ENCODING 110 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 10 1 0 +BITMAP +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 006F +ENCODING 111 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0070 +ENCODING 112 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DC00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0071 +ENCODING 113 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +39 +7D +C3 +C3 +81 +81 +C3 +C3 +7D +39 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 0072 +ENCODING 114 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 10 1 0 +BITMAP +DC +F8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0073 +ENCODING 115 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 0074 +ENCODING 116 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +20 +20 +20 +F8 +F8 +20 +20 +20 +20 +20 +20 +38 +38 +ENDCHAR +STARTCHAR 0075 +ENCODING 117 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 10 1 0 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 0076 +ENCODING 118 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +C180 +6180 +6100 +2300 +3300 +3200 +1600 +1C00 +1C00 +0C00 +ENDCHAR +STARTCHAR 0077 +ENCODING 119 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 10 0 0 +BITMAP +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 0078 +ENCODING 120 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +6180 +6300 +3600 +1E00 +0C00 +1C00 +1E00 +3300 +6300 +E180 +ENDCHAR +STARTCHAR 0079 +ENCODING 121 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 007A +ENCODING 122 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +7F80 +7F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FF80 +FF80 +ENDCHAR +STARTCHAR 007B +ENCODING 123 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 18 1 -4 +BITMAP +38 +38 +60 +60 +60 +60 +60 +60 +C0 +C0 +60 +60 +60 +60 +60 +20 +38 +38 +ENDCHAR +STARTCHAR 007C +ENCODING 124 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 1 18 2 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 007D +ENCODING 125 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 18 0 -4 +BITMAP +E0 +F0 +30 +30 +30 +30 +30 +18 +1C +1C +18 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 007E +ENCODING 126 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 4 1 4 +BITMAP +7000 +FC80 +8F80 +0700 +ENDCHAR +STARTCHAR 00A0 +ENCODING 160 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 0 0 0 0 +BITMAP +ENDCHAR +STARTCHAR 00A1 +ENCODING 161 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 14 2 -4 +BITMAP +C0 +C0 +00 +40 +40 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00A2 +ENCODING 162 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 -4 +BITMAP +02 +02 +02 +06 +3C +7F +E7 +C8 +C8 +C8 +D1 +F3 +7F +3C +20 +20 +20 +40 +ENDCHAR +STARTCHAR 00A3 +ENCODING 163 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +1F00 +3F80 +30C0 +6000 +6000 +2000 +FE00 +FE00 +3000 +3000 +2000 +7C40 +FFC0 +4380 +ENDCHAR +STARTCHAR 00A4 +ENCODING 164 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 8 1 2 +BITMAP +9D +FF +63 +C1 +C1 +63 +FF +9D +ENDCHAR +STARTCHAR 00A5 +ENCODING 165 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +C0C0 +60C0 +6180 +3180 +3300 +1B00 +1E00 +7FC0 +7FC0 +0C00 +7FC0 +7FC0 +0C00 +0C00 +ENDCHAR +STARTCHAR 00A6 +ENCODING 166 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 1 18 2 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +00 +00 +00 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 00A7 +ENCODING 167 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +3C00 +7E00 +6300 +6000 +7000 +7C00 +8E00 +8300 +C180 +E180 +3900 +1E00 +0600 +0300 +C300 +6300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00A8 +ENCODING 168 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 2 1 12 +BITMAP +98 +98 +ENDCHAR +STARTCHAR 00A9 +ENCODING 169 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +0FC0 +1860 +2010 +4788 +CC4C +8804 +9804 +9804 +8844 +CCCC +4788 +2010 +1860 +0FC0 +ENDCHAR +STARTCHAR 00AA +ENCODING 170 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 7 0 7 +BITMAP +3C +44 +04 +7C +C4 +4C +7C +ENDCHAR +STARTCHAR 00AB +ENCODING 171 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 9 1 1 +BITMAP +13 +32 +26 +64 +CC +64 +26 +32 +13 +ENDCHAR +STARTCHAR 00AC +ENCODING 172 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 6 1 4 +BITMAP +FF80 +FF80 +0180 +0180 +0180 +0180 +ENDCHAR +STARTCHAR 00AD +ENCODING 173 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 2 1 4 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR 00AE +ENCODING 174 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 14 14 0 0 +BITMAP +0FC0 +1860 +2010 +4F88 +C8CC +88C4 +8F84 +8904 +8884 +C8CC +4848 +2010 +1860 +0FC0 +ENDCHAR +STARTCHAR 00AF +ENCODING 175 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 2 0 15 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00B0 +ENCODING 176 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 5 5 1 9 +BITMAP +70 +C8 +88 +C8 +70 +ENDCHAR +STARTCHAR 00B1 +ENCODING 177 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 11 1 0 +BITMAP +1800 +1800 +1800 +1800 +FF80 +FF80 +1800 +1800 +1800 +FF80 +FF80 +ENDCHAR +STARTCHAR 00B2 +ENCODING 178 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 7 0 7 +BITMAP +78 +4C +0C +18 +30 +60 +FC +ENDCHAR +STARTCHAR 00B3 +ENCODING 179 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 7 0 7 +BITMAP +78 +4C +0C +18 +0C +CC +78 +ENDCHAR +STARTCHAR 00B4 +ENCODING 180 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 3 2 11 +BITMAP +60 +40 +C0 +ENDCHAR +STARTCHAR 00B5 +ENCODING 181 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C1 +E3 +FF +DD +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00B6 +ENCODING 182 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 17 0 -3 +BITMAP +3FC0 +7FC0 +F980 +F980 +F980 +F980 +7980 +3980 +0980 +0980 +0980 +0980 +0980 +0980 +0980 +0980 +0980 +ENDCHAR +STARTCHAR 00B7 +ENCODING 183 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 2 2 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 00B8 +ENCODING 184 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 4 1 -4 +BITMAP +60 +70 +30 +E0 +ENDCHAR +STARTCHAR 00B9 +ENCODING 185 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 7 1 7 +BITMAP +20 +60 +E0 +A0 +20 +20 +20 +ENDCHAR +STARTCHAR 00BA +ENCODING 186 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 7 0 7 +BITMAP +38 +44 +44 +C6 +44 +44 +38 +ENDCHAR +STARTCHAR 00BB +ENCODING 187 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 7 9 2 1 +BITMAP +98 +C8 +4C +66 +36 +66 +4C +C8 +98 +ENDCHAR +STARTCHAR 00BC +ENCODING 188 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +2018 +6030 +E020 +A040 +20C0 +2080 +2100 +030C +061C +041C +082C +186C +307E +200C +ENDCHAR +STARTCHAR 00BD +ENCODING 189 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +2010 +6030 +E020 +A040 +20C0 +2180 +2100 +023C +0664 +0C04 +080C +1018 +3030 +607E +ENDCHAR +STARTCHAR 00BE +ENCODING 190 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 16 14 0 0 +BITMAP +780C +4C18 +0C10 +1820 +0C60 +CC40 +7880 +0186 +030E +020E +0416 +0C36 +183F +1006 +ENDCHAR +STARTCHAR 00BF +ENCODING 191 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 9 14 1 -4 +BITMAP +0C00 +0C00 +0000 +0C00 +0C00 +0800 +1800 +3000 +6000 +4000 +C180 +6180 +7F00 +1E00 +ENDCHAR +STARTCHAR 00C0 +ENCODING 192 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0600 +0600 +0200 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C1 +ENCODING 193 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0300 +0200 +0600 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C2 +ENCODING 194 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0600 +0F00 +0980 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C3 +ENCODING 195 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0C80 +1F80 +1B80 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C4 +ENCODING 196 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 17 0 0 +BITMAP +0980 +0980 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C5 +ENCODING 197 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0600 +0900 +0900 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 00C6 +ENCODING 198 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 18 14 0 0 +BITMAP +03FFC0 +03FFC0 +066000 +066000 +0C6000 +0C6000 +087F80 +187F80 +1FE000 +3FE000 +306000 +606000 +607FC0 +C07FC0 +ENDCHAR +STARTCHAR 00C7 +ENCODING 199 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +0400 +0600 +0300 +0E00 +ENDCHAR +STARTCHAR 00C8 +ENCODING 200 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0C00 +0C00 +0600 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00C9 +ENCODING 201 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0600 +0600 +0C00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00CA +ENCODING 202 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +0A00 +1B00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00CB +ENCODING 203 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +1B00 +1B00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 00CC +ENCODING 204 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 3 18 1 0 +BITMAP +C0 +40 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 00CD +ENCODING 205 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 18 2 0 +BITMAP +C0 +C0 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00CE +ENCODING 206 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 18 0 0 +BITMAP +70 +58 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00CF +ENCODING 207 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 17 0 0 +BITMAP +D8 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00D0 +ENCODING 208 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +7F80 +7FE0 +6070 +6030 +6010 +6018 +FE18 +FE18 +6018 +6030 +6030 +6070 +7FE0 +7F80 +ENDCHAR +STARTCHAR 00D1 +ENCODING 209 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0C80 +1F80 +1300 +0000 +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 00D2 +ENCODING 210 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0C00 +0600 +0200 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D3 +ENCODING 211 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0300 +0300 +0600 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D4 +ENCODING 212 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0700 +0D00 +0D80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D5 +ENCODING 213 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0EC0 +0F80 +1B80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D6 +ENCODING 214 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 17 1 0 +BITMAP +0D80 +0D80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 00D7 +ENCODING 215 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 7 7 2 3 +BITMAP +82 +C6 +7C +38 +7C +C6 +82 +ENDCHAR +STARTCHAR 00D8 +ENCODING 216 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 15 1 -1 +BITMAP +0F88 +3FD0 +7060 +6070 +C0D0 +C198 +C318 +C618 +CC18 +D818 +7030 +7070 +7FE0 +DF80 +8000 +ENDCHAR +STARTCHAR 00D9 +ENCODING 217 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0C00 +0400 +0600 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DA +ENCODING 218 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0300 +0600 +0400 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DB +ENCODING 219 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0600 +0F00 +1900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DC +ENCODING 220 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 17 1 0 +BITMAP +1900 +1900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 00DD +ENCODING 221 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0300 +0300 +0600 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 00DE +ENCODING 222 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C000 +C000 +C000 +FF80 +FFC0 +C0E0 +C060 +C060 +C0E0 +FFC0 +FF80 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 00DF +ENCODING 223 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +3C00 +7E00 +6300 +C300 +C200 +C600 +C400 +C600 +C380 +C1C0 +C0C0 +D8C0 +CFC0 +C780 +ENDCHAR +STARTCHAR 00E0 +ENCODING 224 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3800 +1800 +0800 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E1 +ENCODING 225 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E2 +ENCODING 226 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E3 +ENCODING 227 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3200 +7E00 +4E00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E4 +ENCODING 228 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2600 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E5 +ENCODING 229 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 16 1 0 +BITMAP +1800 +2400 +2400 +2400 +1800 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 00E6 +ENCODING 230 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 10 1 0 +BITMAP +3E78 +7FFC +C386 +0F06 +7FFE +F3FE +8300 +C786 +FFFC +7878 +ENDCHAR +STARTCHAR 00E7 +ENCODING 231 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +10 +18 +0C +38 +ENDCHAR +STARTCHAR 00E8 +ENCODING 232 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3000 +1800 +0800 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00E9 +ENCODING 233 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00EA +ENCODING 234 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00EB +ENCODING 235 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2600 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 00EC +ENCODING 236 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 3 14 1 0 +BITMAP +C0 +C0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 00ED +ENCODING 237 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 3 14 2 0 +BITMAP +60 +C0 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 00EE +ENCODING 238 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +30 +78 +C8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00EF +ENCODING 239 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +C8 +C8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 00F0 +ENCODING 240 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3200 +1E00 +3C00 +2600 +3B00 +7F00 +C300 +C180 +8180 +8180 +C180 +E300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F1 +ENCODING 241 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +3B +3E +6E +00 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 00F2 +ENCODING 242 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3000 +1800 +0800 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F3 +ENCODING 243 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F4 +ENCODING 244 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F5 +ENCODING 245 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3200 +7E00 +4E00 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F6 +ENCODING 246 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2600 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 00F7 +ENCODING 247 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 8 1 2 +BITMAP +1800 +1800 +0000 +FF80 +FF80 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 00F8 +ENCODING 248 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 9 12 1 -1 +BITMAP +0080 +1E80 +7F00 +6380 +C680 +C480 +C880 +D180 +7380 +7F00 +5E00 +8000 +ENDCHAR +STARTCHAR 00F9 +ENCODING 249 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +18 +18 +0C +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 00FA +ENCODING 250 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +0C +0C +18 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 00FB +ENCODING 251 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +18 +3C +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 00FC +ENCODING 252 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 13 1 0 +BITMAP +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 00FD +ENCODING 253 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +0C +08 +18 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 00FE +ENCODING 254 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +C000 +C000 +C000 +C000 +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DC00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 00FF +ENCODING 255 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 17 1 -4 +BITMAP +64 +64 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0100 +ENCODING 256 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 16 0 0 +BITMAP +1F80 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0101 +ENCODING 257 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +3E00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 0102 +ENCODING 258 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0880 +0980 +0700 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0103 +ENCODING 259 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 0104 +ENCODING 260 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 18 0 -4 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +0010 +0020 +0030 +001C +ENDCHAR +STARTCHAR 0105 +ENCODING 261 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 14 1 -4 +BITMAP +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +0100 +0100 +0100 +01E0 +ENDCHAR +STARTCHAR 0106 +ENCODING 262 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0300 +0300 +0600 +0000 +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 0107 +ENCODING 263 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +08 +18 +00 +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 0108 +ENCODING 264 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0600 +0F00 +0980 +0000 +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 0109 +ENCODING 265 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +1C +14 +36 +00 +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 010A +ENCODING 266 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 17 1 0 +BITMAP +0600 +0600 +0000 +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 010B +ENCODING 267 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +18 +18 +00 +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 010C +ENCODING 268 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0D80 +0D00 +0700 +0000 +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 010D +ENCODING 269 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +26 +3C +18 +00 +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 010E +ENCODING 270 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +3600 +1400 +1C00 +0000 +FF00 +FFC0 +C0E0 +C060 +C020 +C030 +C030 +C030 +C030 +C060 +C060 +C0E0 +FFC0 +FF00 +ENDCHAR +STARTCHAR 010F +ENCODING 271 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +0160 +0160 +0120 +0140 +3D00 +7F00 +C300 +C300 +8100 +8100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 0110 +ENCODING 272 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +7F80 +7FE0 +6070 +6030 +6010 +6018 +FE18 +FE18 +6018 +6030 +6030 +6070 +7FE0 +7F80 +ENDCHAR +STARTCHAR 0111 +ENCODING 273 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +0100 +1FC0 +1FC0 +0100 +3900 +7D00 +C300 +C300 +8100 +8100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 0112 +ENCODING 274 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 16 1 0 +BITMAP +1F80 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0113 +ENCODING 275 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +7E00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0114 +ENCODING 276 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1100 +1100 +0E00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0115 +ENCODING 277 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +2200 +2200 +1C00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0116 +ENCODING 278 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +0600 +0600 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0117 +ENCODING 279 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +1C00 +1C00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0118 +ENCODING 280 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +0100 +0100 +0100 +01E0 +ENDCHAR +STARTCHAR 0119 +ENCODING 281 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +0800 +0800 +0800 +0F00 +ENDCHAR +STARTCHAR 011A +ENCODING 282 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1300 +1E00 +0C00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 011B +ENCODING 283 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3600 +3400 +1C00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 011C +ENCODING 284 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0300 +0780 +0CC0 +0000 +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 011D +ENCODING 285 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 -4 +BITMAP +18 +3C +66 +00 +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +01 +C3 +FE +7C +ENDCHAR +STARTCHAR 011E +ENCODING 286 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0C40 +0480 +0780 +0000 +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 011F +ENCODING 287 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 -4 +BITMAP +22 +26 +1C +00 +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +01 +C3 +FE +7C +ENDCHAR +STARTCHAR 0120 +ENCODING 288 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 17 1 0 +BITMAP +0300 +0300 +0000 +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +ENDCHAR +STARTCHAR 0121 +ENCODING 289 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 17 1 -4 +BITMAP +18 +18 +00 +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +01 +C3 +FE +7C +ENDCHAR +STARTCHAR 0122 +ENCODING 290 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 -4 +BITMAP +0F80 +3FE0 +7070 +6030 +C010 +C000 +C000 +C1F8 +C1F8 +C018 +6018 +7038 +3FF0 +0FC0 +0300 +0380 +0180 +0700 +ENDCHAR +STARTCHAR 0123 +ENCODING 291 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 19 1 -4 +BITMAP +08 +10 +18 +18 +00 +3D +7F +C3 +C3 +81 +81 +C3 +C3 +7F +3D +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 0124 +ENCODING 292 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 18 2 0 +BITMAP +0C00 +1E00 +1300 +0000 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 0125 +ENCODING 293 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 0 +BITMAP +0C +1E +33 +00 +C0 +C0 +C0 +C0 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 0126 +ENCODING 294 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +2030 +FFF8 +FFF8 +2030 +2030 +3FF0 +3FF0 +2030 +2030 +2030 +2030 +2030 +2030 +2030 +ENDCHAR +STARTCHAR 0127 +ENCODING 295 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 0 0 +BITMAP +6000 +FC00 +FC00 +6000 +6F00 +7F80 +7180 +6080 +6080 +6080 +6080 +6080 +6080 +6080 +ENDCHAR +STARTCHAR 0128 +ENCODING 296 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 7 18 -1 0 +BITMAP +76 +7C +DC +00 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 0129 +ENCODING 297 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 14 0 0 +BITMAP +EC +FC +98 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012A +ENCODING 298 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 16 0 0 +BITMAP +FC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012B +ENCODING 299 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 0 0 +BITMAP +FC +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012C +ENCODING 300 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 18 0 0 +BITMAP +88 +C8 +70 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012D +ENCODING 301 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 14 0 0 +BITMAP +88 +C8 +70 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 012E +ENCODING 302 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 18 2 -4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +F0 +ENDCHAR +STARTCHAR 012F +ENCODING 303 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 18 1 -4 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +80 +80 +80 +70 +ENDCHAR +STARTCHAR 0130 +ENCODING 304 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 17 2 0 +BITMAP +C0 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0131 +ENCODING 305 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 10 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0132 +ENCODING 306 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 2 0 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C860 +CC60 +CFC0 +C780 +ENDCHAR +STARTCHAR 0133 +ENCODING 307 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 18 1 -4 +BITMAP +C4 +C4 +00 +00 +C4 +C4 +C4 +C4 +C4 +C4 +C4 +C4 +C4 +C4 +04 +04 +1C +1C +ENDCHAR +STARTCHAR 0134 +ENCODING 308 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 18 1 0 +BITMAP +0700 +0D00 +0D80 +0000 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +8600 +C600 +FC00 +7800 +ENDCHAR +STARTCHAR 0135 +ENCODING 309 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 6 18 -1 -4 +BITMAP +30 +78 +4C +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0136 +ENCODING 310 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +FC00 +F600 +E700 +C300 +C180 +C0C0 +C0E0 +C060 +0000 +0700 +0100 +0F00 +ENDCHAR +STARTCHAR 0137 +ENCODING 311 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +C0 +C0 +C0 +C0 +C7 +CE +DC +F8 +F8 +D8 +CC +C6 +C6 +C3 +00 +0C +06 +1C +ENDCHAR +STARTCHAR 0138 +ENCODING 312 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C7 +CE +D8 +F0 +F8 +C8 +CC +C6 +C6 +C3 +ENDCHAR +STARTCHAR 0139 +ENCODING 313 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +1800 +3000 +3000 +0000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 013A +ENCODING 314 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 18 1 0 +BITMAP +60 +C0 +80 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 013B +ENCODING 315 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +0000 +0E00 +0200 +1E00 +ENDCHAR +STARTCHAR 013C +ENCODING 316 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 18 0 -4 +BITMAP +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +00 +70 +30 +E0 +ENDCHAR +STARTCHAR 013D +ENCODING 317 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C300 +C300 +C200 +C200 +C200 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 013E +ENCODING 318 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 14 1 0 +BITMAP +D8 +D8 +D0 +D0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 013F +ENCODING 319 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +C000 +C300 +C300 +C000 +C000 +C000 +C000 +FF80 +FF80 +ENDCHAR +STARTCHAR 0140 +ENCODING 320 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +D8 +D8 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0141 +ENCODING 321 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +6000 +6000 +6000 +6400 +6C00 +7800 +7000 +E000 +E000 +6000 +6000 +6000 +7FC0 +7FC0 +ENDCHAR +STARTCHAR 0142 +ENCODING 322 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 14 0 0 +BITMAP +60 +60 +60 +60 +70 +70 +60 +E0 +E0 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 0143 +ENCODING 323 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0600 +0600 +0400 +0000 +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 0144 +ENCODING 324 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +0C +0C +18 +00 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 0145 +ENCODING 325 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 -4 +BITMAP +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +0000 +0700 +0180 +0700 +ENDCHAR +STARTCHAR 0146 +ENCODING 326 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +00 +1C +04 +3C +ENDCHAR +STARTCHAR 0147 +ENCODING 327 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +1900 +0F00 +0600 +0000 +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 0148 +ENCODING 328 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +36 +34 +1C +00 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 0149 +ENCODING 329 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +C000 +C000 +4000 +8000 +B780 +3FC0 +38C0 +30C0 +30C0 +30C0 +30C0 +30C0 +30C0 +30C0 +ENDCHAR +STARTCHAR 014A +ENCODING 330 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 2 0 +BITMAP +9F00 +BF80 +E1C0 +C0C0 +C060 +8060 +8060 +8060 +8060 +8060 +80C0 +80C0 +8780 +8F00 +ENDCHAR +STARTCHAR 014B +ENCODING 331 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +01 +03 +07 +06 +ENDCHAR +STARTCHAR 014C +ENCODING 332 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 16 1 0 +BITMAP +0F80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 014D +ENCODING 333 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 1 0 +BITMAP +7E00 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 014E +ENCODING 334 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0880 +0880 +0700 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 014F +ENCODING 335 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +2200 +2600 +1C00 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0150 +ENCODING 336 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0CC0 +0D80 +0900 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 0151 +ENCODING 337 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1B00 +3600 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 0152 +ENCODING 338 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 14 1 0 +BITMAP +1F7F80 +3FFF80 +71E000 +60E000 +C06000 +C06000 +C07F80 +C07F80 +C06000 +C06000 +60E000 +71E000 +3FFF80 +1F7F80 +ENDCHAR +STARTCHAR 0153 +ENCODING 339 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 16 10 1 0 +BITMAP +3C3C +7F7E +E3C3 +C183 +C1FF +C1FF +C180 +E3C3 +7F7E +3C3C +ENDCHAR +STARTCHAR 0154 +ENCODING 340 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +0600 +0C00 +0800 +0000 +FFC0 +FFE0 +C060 +C060 +C060 +C060 +FFE0 +FF80 +C300 +C180 +C0C0 +C060 +C060 +C030 +ENDCHAR +STARTCHAR 0155 +ENCODING 341 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 14 1 0 +BITMAP +30 +30 +60 +00 +DC +F8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0156 +ENCODING 342 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +FFC0 +FFE0 +C060 +C060 +C060 +C060 +FFE0 +FF80 +C300 +C180 +C0C0 +C060 +C060 +C030 +0000 +0700 +0180 +0700 +ENDCHAR +STARTCHAR 0157 +ENCODING 343 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 14 1 -4 +BITMAP +DC +F8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +70 +10 +F0 +ENDCHAR +STARTCHAR 0158 +ENCODING 344 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 0 +BITMAP +3300 +1E00 +0C00 +0000 +FFC0 +FFE0 +C060 +C060 +C060 +C060 +FFE0 +FF80 +C300 +C180 +C0C0 +C060 +C060 +C030 +ENDCHAR +STARTCHAR 0159 +ENCODING 345 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 14 1 0 +BITMAP +D8 +50 +70 +00 +DC +F8 +E0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 015A +ENCODING 346 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0600 +0C00 +0800 +0000 +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 015B +ENCODING 347 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +18 +10 +00 +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 015C +ENCODING 348 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0C00 +1A00 +1300 +0000 +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 015D +ENCODING 349 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +18 +3C +66 +00 +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 015E +ENCODING 350 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 -4 +BITMAP +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +0400 +0E00 +0200 +1C00 +ENDCHAR +STARTCHAR 015F +ENCODING 351 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +10 +18 +08 +38 +ENDCHAR +STARTCHAR 0160 +ENCODING 352 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +3300 +1E00 +0C00 +0000 +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0161 +ENCODING 353 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +6C +2C +38 +00 +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 0162 +ENCODING 354 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 19 0 -5 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0000 +0600 +0600 +0200 +0400 +ENDCHAR +STARTCHAR 0163 +ENCODING 355 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 18 0 -5 +BITMAP +20 +20 +20 +F8 +F8 +20 +20 +20 +20 +20 +20 +38 +38 +00 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 0164 +ENCODING 356 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 18 0 0 +BITMAP +1900 +0F00 +0600 +0000 +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0165 +ENCODING 357 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 14 0 0 +BITMAP +06 +26 +22 +22 +F8 +F8 +20 +20 +20 +20 +20 +20 +38 +38 +ENDCHAR +STARTCHAR 0166 +ENCODING 358 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +3FC0 +3FC0 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0167 +ENCODING 359 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +20 +60 +60 +F8 +F8 +60 +60 +F8 +F8 +60 +60 +78 +38 +ENDCHAR +STARTCHAR 0168 +ENCODING 360 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0C80 +1F80 +1300 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0169 +ENCODING 361 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +32 +7E +6E +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 016A +ENCODING 362 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 16 1 0 +BITMAP +1F80 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 016B +ENCODING 363 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 12 1 0 +BITMAP +7E +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 016C +ENCODING 364 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +1180 +0900 +0E00 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 016D +ENCODING 365 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +22 +26 +1C +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 016E +ENCODING 366 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0600 +0A00 +0900 +0A00 +C660 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 016F +ENCODING 367 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 16 1 0 +BITMAP +18 +24 +24 +24 +18 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 0170 +ENCODING 368 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0CC0 +0D80 +1900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0171 +ENCODING 369 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +36 +36 +64 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 0172 +ENCODING 370 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 -4 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +0400 +0400 +0400 +0380 +ENDCHAR +STARTCHAR 0173 +ENCODING 371 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -4 +BITMAP +C100 +C100 +C100 +C100 +C100 +C100 +C300 +C300 +7F00 +3D00 +0100 +0300 +0300 +01C0 +ENDCHAR +STARTCHAR 0174 +ENCODING 372 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 18 0 0 +BITMAP +00C000 +01E000 +033000 +000000 +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 0175 +ENCODING 373 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +0300 +0780 +0CC0 +0000 +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 0176 +ENCODING 374 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0700 +0500 +0D80 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0177 +ENCODING 375 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +18 +3C +26 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0178 +ENCODING 376 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +0980 +0980 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0179 +ENCODING 377 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 18 0 0 +BITMAP +0600 +0600 +0400 +0000 +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 017A +ENCODING 378 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +0600 +0C00 +0800 +0000 +7F80 +7F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FF80 +FF80 +ENDCHAR +STARTCHAR 017B +ENCODING 379 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 17 0 0 +BITMAP +0600 +0600 +0000 +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 017C +ENCODING 380 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +0C00 +0C00 +0000 +7F80 +7F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FF80 +FF80 +ENDCHAR +STARTCHAR 017D +ENCODING 381 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 18 0 0 +BITMAP +1900 +0F00 +0600 +0000 +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 017E +ENCODING 382 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +3300 +1E00 +0C00 +0000 +7F80 +7F80 +0300 +0600 +0C00 +1800 +3000 +6000 +FF80 +FF80 +ENDCHAR +STARTCHAR 017F +ENCODING 383 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 14 1 0 +BITMAP +78 +F0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 018F +ENCODING 399 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6030 +6030 +0030 +FFF0 +FFF0 +C010 +C030 +6030 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 0192 +ENCODING 402 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 18 0 -4 +BITMAP +03C0 +03C0 +0200 +0600 +1F80 +1F80 +0600 +0400 +0400 +0C00 +0C00 +0C00 +0800 +0800 +1800 +1800 +7800 +F000 +ENDCHAR +STARTCHAR 01A0 +ENCODING 416 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 01A1 +ENCODING 417 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 10 1 0 +BITMAP +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 01AF +ENCODING 431 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01B0 +ENCODING 432 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 01CD +ENCODING 461 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0980 +0F00 +0600 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 01CE +ENCODING 462 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3600 +1400 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 01CF +ENCODING 463 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 18 0 0 +BITMAP +D8 +58 +70 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 01D0 +ENCODING 464 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 14 0 0 +BITMAP +98 +F0 +60 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 01D1 +ENCODING 465 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0D80 +0500 +0700 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 01D2 +ENCODING 466 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +2600 +3400 +1800 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 01D3 +ENCODING 467 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +1980 +0F00 +0600 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01D4 +ENCODING 468 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +36 +34 +1C +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01D5 +ENCODING 469 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0F00 +0000 +0900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01D6 +ENCODING 470 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 15 1 0 +BITMAP +7E +00 +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01D7 +ENCODING 471 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0300 +0600 +0900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01D8 +ENCODING 472 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 17 1 0 +BITMAP +0C +0C +18 +00 +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01D9 +ENCODING 473 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0F00 +0600 +0900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01DA +ENCODING 474 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 17 1 0 +BITMAP +36 +34 +1C +00 +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01DB +ENCODING 475 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0C00 +0600 +0900 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 01DC +ENCODING 476 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 17 1 0 +BITMAP +30 +18 +08 +00 +26 +26 +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 01FA +ENCODING 506 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 20 0 0 +BITMAP +0300 +0300 +0600 +0900 +0900 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 01FB +ENCODING 507 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 20 1 0 +BITMAP +0600 +0C00 +0800 +0000 +1800 +2400 +2400 +2400 +1800 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 01FC +ENCODING 508 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 18 18 0 0 +BITMAP +006000 +006000 +00C000 +000000 +03FFC0 +03FFC0 +066000 +066000 +0C6000 +0C6000 +087F80 +187F80 +1FE000 +3FE000 +306000 +606000 +607FC0 +C07FC0 +ENDCHAR +STARTCHAR 01FD +ENCODING 509 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +00C0 +0180 +0100 +0000 +3E78 +7FFC +C386 +0F06 +7FFE +F3FE +8300 +C786 +FFFC +7878 +ENDCHAR +STARTCHAR 01FE +ENCODING 510 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 19 1 -1 +BITMAP +0300 +0300 +0200 +0000 +0F88 +3FD0 +7060 +6070 +C0D0 +C198 +C318 +C618 +CC18 +D818 +7030 +7070 +7FE0 +DF80 +8000 +ENDCHAR +STARTCHAR 01FF +ENCODING 511 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 9 15 1 -1 +BITMAP +0600 +0400 +0C00 +0080 +1E80 +7F00 +6380 +C680 +C480 +C880 +D180 +7380 +7F00 +5E00 +8000 +ENDCHAR +STARTCHAR 0259 +ENCODING 601 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +FF00 +C300 +0180 +FF80 +FF80 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 02C6 +ENCODING 710 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 3 1 11 +BITMAP +60 +F0 +98 +ENDCHAR +STARTCHAR 02C7 +ENCODING 711 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 3 1 11 +BITMAP +D8 +D0 +70 +ENDCHAR +STARTCHAR 02C9 +ENCODING 713 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 1 0 11 +BITMAP +FC +ENDCHAR +STARTCHAR 02D8 +ENCODING 728 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 11 +BITMAP +C4 +4C +38 +ENDCHAR +STARTCHAR 02D9 +ENCODING 729 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 2 2 11 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 02DA +ENCODING 730 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 5 1 9 +BITMAP +60 +90 +90 +90 +60 +ENDCHAR +STARTCHAR 02DB +ENCODING 731 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 4 2 -4 +BITMAP +80 +80 +80 +F0 +ENDCHAR +STARTCHAR 02DC +ENCODING 732 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 11 +BITMAP +64 +FC +9C +ENDCHAR +STARTCHAR 02DD +ENCODING 733 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 1 11 +BITMAP +EC +D8 +90 +ENDCHAR +STARTCHAR 0300 +ENCODING 768 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -5 15 +BITMAP +C0 +60 +20 +ENDCHAR +STARTCHAR 0301 +ENCODING 769 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -3 15 +BITMAP +60 +C0 +80 +ENDCHAR +STARTCHAR 0303 +ENCODING 771 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -8 15 +BITMAP +EC +98 +ENDCHAR +STARTCHAR 0309 +ENCODING 777 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -4 15 +BITMAP +E0 +30 +60 +ENDCHAR +STARTCHAR 0323 +ENCODING 803 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 037E +ENCODING 894 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 13 2 -3 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +40 +80 +80 +ENDCHAR +STARTCHAR 0384 +ENCODING 900 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 3 2 11 +BITMAP +60 +40 +C0 +ENDCHAR +STARTCHAR 0385 +ENCODING 901 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 7 3 0 11 +BITMAP +18 +96 +A6 +ENDCHAR +STARTCHAR 0386 +ENCODING 902 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +3600 +6700 +4F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0387 +ENCODING 903 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 2 2 8 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 0388 +ENCODING 904 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 -1 0 +BITMAP +67FE +67FE +C600 +0600 +0600 +0600 +07FC +07FC +0600 +0600 +0600 +0600 +07FE +07FE +ENDCHAR +STARTCHAR 0389 +ENCODING 905 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 -1 0 +BITMAP +6C06 +6C06 +CC06 +0C06 +0C06 +0C06 +0FFE +0FFE +0C06 +0C06 +0C06 +0C06 +0C06 +0C06 +ENDCHAR +STARTCHAR 038A +ENCODING 906 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 14 -1 0 +BITMAP +6C +6C +CC +0C +0C +0C +0C +0C +0C +0C +0C +0C +0C +0C +ENDCHAR +STARTCHAR 038C +ENCODING 908 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 -1 0 +BITMAP +63E0 +6FF8 +DC18 +180C +300C +3006 +3006 +3006 +3006 +300C +180C +1C18 +0FF8 +03E0 +ENDCHAR +STARTCHAR 038E +ENCODING 910 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 14 -1 0 +BITMAP +660180 +630300 +C30600 +018600 +018C00 +00D800 +007800 +007000 +003000 +003000 +003000 +003000 +003000 +003000 +ENDCHAR +STARTCHAR 038F +ENCODING 911 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 14 14 -1 0 +BITMAP +63E0 +6FF0 +DC38 +181C +300C +300C +300C +300C +300C +180C +0818 +0C30 +3E7C +3E7C +ENDCHAR +STARTCHAR 0390 +ENCODING 912 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 6 15 -1 0 +BITMAP +18 +94 +A4 +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 0391 +ENCODING 913 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0392 +ENCODING 914 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF00 +FF80 +C0C0 +C0C0 +C0C0 +C0C0 +FF80 +FF80 +C0C0 +C060 +C060 +C0C0 +FFC0 +FF80 +ENDCHAR +STARTCHAR 0393 +ENCODING 915 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 2 0 +BITMAP +FF +FF +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0394 +ENCODING 916 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3060 +2060 +6060 +6030 +7FF0 +FFF8 +ENDCHAR +STARTCHAR 0395 +ENCODING 917 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0396 +ENCODING 918 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +7FE0 +7FE0 +00C0 +01C0 +0180 +0300 +0600 +0C00 +1C00 +3800 +3000 +6000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0397 +ENCODING 919 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 0398 +ENCODING 920 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +CF98 +CF98 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 0399 +ENCODING 921 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 039A +ENCODING 922 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C0E0 +C1C0 +C380 +C700 +CE00 +DC00 +FC00 +F600 +E700 +C300 +C180 +C0C0 +C0E0 +C060 +ENDCHAR +STARTCHAR 039B +ENCODING 923 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1880 +18C0 +10C0 +3040 +3060 +6060 +6030 +4030 +C030 +ENDCHAR +STARTCHAR 039C +ENCODING 924 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 14 1 0 +BITMAP +E018 +F038 +F028 +D028 +D868 +D868 +C848 +CCC8 +CCC8 +C488 +C788 +C788 +C308 +C308 +ENDCHAR +STARTCHAR 039D +ENCODING 925 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +E060 +E060 +F060 +D860 +D860 +CC60 +CC60 +C660 +C360 +C360 +C1E0 +C0E0 +C0E0 +C060 +ENDCHAR +STARTCHAR 039E +ENCODING 926 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FFC0 +FFC0 +0000 +0000 +0000 +0000 +7F80 +7F80 +0000 +0000 +0000 +0000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 039F +ENCODING 927 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 03A0 +ENCODING 928 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 03A1 +ENCODING 929 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF80 +FFC0 +C0E0 +C060 +C060 +C060 +C0C0 +FFC0 +FF80 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 03A3 +ENCODING 931 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 1 0 +BITMAP +FFC0 +FFC0 +6000 +3000 +1800 +0C00 +0600 +0C00 +1800 +3800 +7000 +6000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 03A4 +ENCODING 932 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 03A5 +ENCODING 933 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 03A6 +ENCODING 934 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0200 +0200 +1FC0 +7FF0 +E238 +C218 +C218 +C218 +C218 +E238 +7FF0 +1FC0 +0200 +0200 +ENDCHAR +STARTCHAR 03A7 +ENCODING 935 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +6030 +3060 +30C0 +18C0 +0D80 +0F00 +0700 +0700 +0D80 +1980 +18C0 +3060 +6070 +E030 +ENDCHAR +STARTCHAR 03A8 +ENCODING 936 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +C30C +C30C +C30C +C30C +C30C +C30C +E318 +7338 +3FF0 +1FE0 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 03A9 +ENCODING 937 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6070 +C030 +C030 +C030 +C030 +C030 +4020 +6060 +30C0 +F9F0 +F9F0 +ENDCHAR +STARTCHAR 03AA +ENCODING 938 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 17 0 0 +BITMAP +D8 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 03AB +ENCODING 939 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 17 0 0 +BITMAP +0980 +0980 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 03AC +ENCODING 940 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3D80 +7F80 +C380 +C300 +C100 +C100 +C300 +C380 +7F80 +3D80 +ENDCHAR +STARTCHAR 03AD +ENCODING 941 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 14 1 0 +BITMAP +18 +18 +10 +00 +78 +7C +C4 +C0 +70 +70 +C0 +C4 +FE +78 +ENDCHAR +STARTCHAR 03AE +ENCODING 942 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 18 1 -4 +BITMAP +0C +0C +08 +00 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 03AF +ENCODING 943 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 14 1 0 +BITMAP +60 +40 +C0 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 03B0 +ENCODING 944 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +4B +53 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR 03B1 +ENCODING 945 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3D80 +7F80 +C380 +C300 +C100 +C100 +C300 +C380 +7F80 +3D80 +ENDCHAR +STARTCHAR 03B2 +ENCODING 946 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 -4 +BITMAP +3E00 +7F00 +6300 +C100 +C300 +DC00 +DF00 +C380 +C180 +C180 +C180 +E380 +FF00 +DE00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 03B3 +ENCODING 947 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 -4 +BITMAP +C180 +6180 +6100 +2300 +3300 +3200 +1600 +1E00 +1C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 03B4 +ENCODING 948 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +7F00 +7F00 +3000 +1800 +3E00 +7F00 +E300 +C180 +8180 +8180 +C180 +E300 +7F00 +3C00 +ENDCHAR +STARTCHAR 03B5 +ENCODING 949 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +78 +7C +C4 +C0 +70 +70 +C0 +C4 +FE +78 +ENDCHAR +STARTCHAR 03B6 +ENCODING 950 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 18 1 -4 +BITMAP +7E +7E +0C +18 +30 +60 +40 +C0 +C0 +80 +80 +C0 +FC +7E +06 +06 +0C +0C +ENDCHAR +STARTCHAR 03B7 +ENCODING 951 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 03B8 +ENCODING 952 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3C00 +7E00 +6300 +C100 +C180 +C180 +FF80 +FF80 +C180 +C180 +C100 +6300 +7E00 +3C00 +ENDCHAR +STARTCHAR 03B9 +ENCODING 953 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 03BA +ENCODING 954 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C7 +CE +D8 +F0 +F0 +D8 +CC +CC +C6 +C3 +ENDCHAR +STARTCHAR 03BB +ENCODING 955 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 0 +BITMAP +1000 +1800 +1800 +0800 +0C00 +1C00 +1E00 +1600 +3600 +3300 +6300 +6100 +6180 +C180 +ENDCHAR +STARTCHAR 03BC +ENCODING 956 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C1 +E3 +FF +DD +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 03BD +ENCODING 957 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +C180 +6180 +6100 +2300 +3300 +3200 +1600 +1C00 +1C00 +0C00 +ENDCHAR +STARTCHAR 03BE +ENCODING 958 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 18 1 -4 +BITMAP +3C +7C +C0 +C0 +40 +7C +1C +60 +C0 +C0 +C0 +C0 +7C +3E +06 +06 +0E +0C +ENDCHAR +STARTCHAR 03BF +ENCODING 959 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 03C0 +ENCODING 960 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 10 0 0 +BITMAP +FFF8 +FFF8 +1840 +1840 +1840 +1840 +1840 +1840 +1840 +1840 +ENDCHAR +STARTCHAR 03C1 +ENCODING 961 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +3E00 +7F00 +6380 +C180 +C180 +C180 +C180 +E380 +FF00 +DE00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 03C2 +ENCODING 962 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -4 +BITMAP +1F +3F +60 +C0 +C0 +80 +C0 +E0 +7C +3E +03 +02 +1E +1C +ENDCHAR +STARTCHAR 03C3 +ENCODING 963 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 10 1 0 +BITMAP +3FC0 +7FC0 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 03C4 +ENCODING 964 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +FE +FE +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 03C5 +ENCODING 965 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR 03C6 +ENCODING 966 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 -4 +BITMAP +3780 +6FC0 +CCC0 +CC60 +8C60 +8C60 +CCC0 +EDC0 +7F80 +3F00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 03C7 +ENCODING 967 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 14 0 -4 +BITMAP +6080 +6180 +3300 +3300 +1E00 +1E00 +0C00 +0C00 +1E00 +1600 +3300 +2100 +6180 +C0C0 +ENDCHAR +STARTCHAR 03C8 +ENCODING 968 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 -4 +BITMAP +C620 +C620 +C620 +C620 +C620 +C620 +C620 +C660 +66C0 +3F80 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 03C9 +ENCODING 969 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 10 1 0 +BITMAP +6030 +4010 +C218 +C218 +C218 +C218 +C618 +C538 +7DF0 +38E0 +ENDCHAR +STARTCHAR 03CA +ENCODING 970 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 13 0 0 +BITMAP +98 +98 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 03CB +ENCODING 971 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 13 1 0 +BITMAP +36 +36 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR 03CC +ENCODING 972 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 03CD +ENCODING 973 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 0 +BITMAP +0C +0C +18 +00 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +E3 +7E +3C +ENDCHAR +STARTCHAR 03CE +ENCODING 974 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0180 +0300 +0200 +0000 +6030 +4010 +C218 +C218 +C218 +C218 +C618 +C538 +7DF0 +38E0 +ENDCHAR +STARTCHAR 0401 +ENCODING 1025 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 17 1 0 +BITMAP +1B00 +1B00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0402 +ENCODING 1026 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 16 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +06F8 +07FE +0706 +0603 +0603 +0603 +0646 +067E +063C +ENDCHAR +STARTCHAR 0403 +ENCODING 1027 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +FF80 +FF80 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0404 +ENCODING 1028 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6070 +C020 +C000 +FE00 +FE00 +C000 +C000 +6030 +7060 +3FE0 +0F80 +ENDCHAR +STARTCHAR 0405 +ENCODING 1029 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +1F00 +7F80 +60C0 +C0C0 +C000 +7000 +3F00 +07C0 +00C0 +C060 +C060 +60C0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 0406 +ENCODING 1030 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 2 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0407 +ENCODING 1031 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 17 0 0 +BITMAP +D8 +D8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 0408 +ENCODING 1032 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 14 1 0 +BITMAP +06 +06 +06 +06 +06 +06 +06 +06 +06 +06 +86 +C6 +FC +78 +ENDCHAR +STARTCHAR 0409 +ENCODING 1033 +SWIDTH 1028 0 +DWIDTH 20 0 +BBX 19 14 0 0 +BITMAP +3FE000 +3FE000 +306000 +306000 +306000 +306000 +307F80 +307FE0 +306060 +306060 +306060 +B06060 +F07FE0 +607F80 +ENDCHAR +STARTCHAR 040A +ENCODING 1034 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 16 14 2 0 +BITMAP +8300 +8300 +8300 +8300 +8300 +8300 +FFFE +FFFF +8303 +8301 +8301 +8303 +83FF +83FE +ENDCHAR +STARTCHAR 040B +ENCODING 1035 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +06F8 +07FC +0706 +0606 +0602 +0602 +0602 +0602 +0602 +ENDCHAR +STARTCHAR 040C +ENCODING 1036 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 18 1 0 +BITMAP +0600 +0C00 +0C00 +0000 +C1C0 +C3C0 +C300 +C600 +C600 +CC00 +F800 +CC00 +C600 +C600 +C300 +C380 +C180 +C1C0 +ENDCHAR +STARTCHAR 040E +ENCODING 1038 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 18 0 0 +BITMAP +0880 +0880 +0700 +0000 +C030 +6020 +6060 +3040 +10C0 +1880 +0980 +0D00 +0700 +0600 +0600 +0600 +3C00 +3800 +ENDCHAR +STARTCHAR 040F +ENCODING 1039 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 -4 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +FFE0 +FFE0 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0410 +ENCODING 1040 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 14 0 0 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 0411 +ENCODING 1041 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 2 0 +BITMAP +FF00 +FF00 +8000 +8000 +8000 +8000 +FF00 +FF80 +81C0 +80C0 +80C0 +81C0 +FF80 +FF00 +ENDCHAR +STARTCHAR 0412 +ENCODING 1042 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF00 +FF80 +C0C0 +C0C0 +C0C0 +C0C0 +FF80 +FF80 +C0C0 +C060 +C060 +C0C0 +FFC0 +FF80 +ENDCHAR +STARTCHAR 0413 +ENCODING 1043 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +FF80 +FF80 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0414 +ENCODING 1044 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 17 0 -3 +BITMAP +1FE0 +1FE0 +1060 +1060 +1060 +1060 +1060 +3060 +3060 +3060 +2060 +6060 +FFF0 +FFF0 +C010 +C010 +C010 +ENDCHAR +STARTCHAR 0415 +ENCODING 1045 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 0416 +ENCODING 1046 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 17 14 0 0 +BITMAP +E0C180 +F0C380 +30C600 +18C600 +18CC00 +0CDC00 +07F000 +0CDC00 +18CC00 +18C600 +30C700 +70C300 +60C380 +E0C180 +ENDCHAR +STARTCHAR 0417 +ENCODING 1047 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +3E00 +7F00 +E380 +C180 +0180 +0380 +0F00 +0F80 +0180 +00C0 +C0C0 +E180 +7F80 +3E00 +ENDCHAR +STARTCHAR 0418 +ENCODING 1048 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +C060 +C0E0 +C0E0 +C1A0 +C3A0 +C320 +C620 +CE20 +CC20 +D820 +D820 +F020 +E020 +E020 +ENDCHAR +STARTCHAR 0419 +ENCODING 1049 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +1100 +1900 +0E00 +0000 +C060 +C0E0 +C0E0 +C1A0 +C3A0 +C320 +C620 +CE20 +CC20 +D820 +D820 +F020 +E020 +E020 +ENDCHAR +STARTCHAR 041A +ENCODING 1050 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +C1C0 +C3C0 +C300 +C600 +C600 +CC00 +F800 +CC00 +C600 +C600 +C300 +C380 +C180 +C1C0 +ENDCHAR +STARTCHAR 041B +ENCODING 1051 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +3FE0 +3FE0 +3060 +3060 +3060 +3060 +3060 +3060 +3060 +3060 +3060 +B060 +F060 +6060 +ENDCHAR +STARTCHAR 041C +ENCODING 1052 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 14 1 0 +BITMAP +E018 +F038 +F028 +D028 +D868 +D868 +C848 +CCC8 +CCC8 +C488 +C788 +C788 +C308 +C308 +ENDCHAR +STARTCHAR 041D +ENCODING 1053 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 0 +BITMAP +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80C0 +ENDCHAR +STARTCHAR 041E +ENCODING 1054 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 041F +ENCODING 1055 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +FFE0 +FFE0 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +ENDCHAR +STARTCHAR 0420 +ENCODING 1056 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +FF80 +FFC0 +C0E0 +C060 +C060 +C060 +C0C0 +FFC0 +FF80 +C000 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0421 +ENCODING 1057 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6070 +C000 +C000 +C000 +C000 +C000 +C030 +6070 +70E0 +3FC0 +0F80 +ENDCHAR +STARTCHAR 0422 +ENCODING 1058 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 0 0 +BITMAP +FFE0 +FFE0 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 0423 +ENCODING 1059 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 14 0 0 +BITMAP +C030 +6020 +6060 +3040 +10C0 +1880 +0980 +0D00 +0700 +0600 +0600 +0600 +3C00 +3800 +ENDCHAR +STARTCHAR 0424 +ENCODING 1060 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 1 0 +BITMAP +0600 +0600 +1FC0 +7FE0 +E670 +C630 +C618 +C618 +C630 +E670 +7FE0 +1FC0 +0600 +0600 +ENDCHAR +STARTCHAR 0425 +ENCODING 1061 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 14 0 0 +BITMAP +6030 +3060 +30C0 +18C0 +0D80 +0F00 +0700 +0700 +0D80 +1980 +18C0 +3060 +6070 +E030 +ENDCHAR +STARTCHAR 0426 +ENCODING 1062 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +FFF0 +FFF0 +0010 +0010 +0010 +0010 +ENDCHAR +STARTCHAR 0427 +ENCODING 1063 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 14 1 0 +BITMAP +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +C0C0 +E1C0 +7FC0 +3EC0 +00C0 +00C0 +00C0 +00C0 +ENDCHAR +STARTCHAR 0428 +ENCODING 1064 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +FFFE +FFFE +ENDCHAR +STARTCHAR 0429 +ENCODING 1065 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 16 18 1 -4 +BITMAP +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +C186 +FFFF +FFFF +0001 +0001 +0001 +0001 +ENDCHAR +STARTCHAR 042A +ENCODING 1066 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 14 0 0 +BITMAP +FC00 +FC00 +0C00 +0C00 +0C00 +0C00 +0FF0 +0FFC +0C0C +0C0C +0C0C +0C0C +0FFC +0FF0 +ENDCHAR +STARTCHAR 042B +ENCODING 1067 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 13 14 2 0 +BITMAP +8018 +8018 +8018 +8018 +8018 +8018 +FF18 +FF98 +81D8 +80D8 +80D8 +81D8 +FF98 +FF18 +ENDCHAR +STARTCHAR 042C +ENCODING 1068 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 10 14 2 0 +BITMAP +8000 +8000 +8000 +8000 +8000 +8000 +FF00 +FF80 +81C0 +80C0 +80C0 +8180 +FF80 +FF00 +ENDCHAR +STARTCHAR 042D +ENCODING 1069 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +1F00 +7FC0 +60C0 +C060 +4060 +0030 +07F0 +07F0 +0030 +0020 +C060 +E0E0 +7FC0 +1F00 +ENDCHAR +STARTCHAR 042E +ENCODING 1070 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 16 14 2 0 +BITMAP +80F8 +83FC +870E +8607 +8C03 +8C03 +FC03 +FC03 +8C03 +8C03 +8607 +870E +83FC +80F8 +ENDCHAR +STARTCHAR 042F +ENCODING 1071 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +3FE0 +7FE0 +6060 +C060 +C060 +6060 +7FE0 +3FE0 +1C60 +3860 +3060 +6060 +C060 +C060 +ENDCHAR +STARTCHAR 0430 +ENCODING 1072 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 0431 +ENCODING 1073 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3F80 +7F00 +E000 +C000 +9E00 +BF00 +E380 +C180 +C180 +C180 +C180 +6380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0432 +ENCODING 1074 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +FE +FF +C3 +C3 +FE +FF +C3 +C3 +FF +FE +ENDCHAR +STARTCHAR 0433 +ENCODING 1075 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +FC +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0434 +ENCODING 1076 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 -3 +BITMAP +1F80 +1F80 +3080 +3080 +3080 +3080 +2080 +6080 +FFE0 +FFE0 +8060 +8060 +8060 +ENDCHAR +STARTCHAR 0435 +ENCODING 1077 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0436 +ENCODING 1078 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 10 0 0 +BITMAP +E630 +E670 +3660 +16C0 +0F80 +16C0 +3660 +6620 +6630 +C610 +ENDCHAR +STARTCHAR 0437 +ENCODING 1079 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +78 +FC +C6 +06 +3C +3C +06 +86 +FE +7C +ENDCHAR +STARTCHAR 0438 +ENCODING 1080 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 10 1 0 +BITMAP +C3 +C3 +C7 +CD +C9 +D9 +D1 +F1 +E1 +C1 +ENDCHAR +STARTCHAR 0439 +ENCODING 1081 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +22 +22 +1C +00 +C3 +C3 +C7 +CD +C9 +D9 +D1 +F1 +E1 +C1 +ENDCHAR +STARTCHAR 043A +ENCODING 1082 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +C6 +CE +CC +D8 +F0 +D8 +CC +CC +C6 +C6 +ENDCHAR +STARTCHAR 043B +ENCODING 1083 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 10 0 0 +BITMAP +3FC0 +3FC0 +30C0 +30C0 +30C0 +30C0 +30C0 +30C0 +F0C0 +E0C0 +ENDCHAR +STARTCHAR 043C +ENCODING 1084 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +E0E0 +E0E0 +F1E0 +D1E0 +D160 +DB60 +CA60 +CA60 +CE60 +C460 +ENDCHAR +STARTCHAR 043D +ENCODING 1085 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 10 1 0 +BITMAP +C1 +C1 +C1 +C1 +FF +FF +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 043E +ENCODING 1086 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 043F +ENCODING 1087 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +FF +FF +C3 +C3 +C3 +C3 +C3 +C3 +C3 +C3 +ENDCHAR +STARTCHAR 0440 +ENCODING 1088 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +DE00 +FF00 +E300 +C180 +C180 +C180 +C180 +E300 +FF00 +DC00 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 0441 +ENCODING 1089 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +7F +E3 +C0 +80 +80 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 0442 +ENCODING 1090 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +FF +FF +08 +08 +08 +08 +08 +08 +08 +08 +ENDCHAR +STARTCHAR 0443 +ENCODING 1091 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0444 +ENCODING 1092 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 -4 +BITMAP +0300 +0300 +0300 +0300 +3BF0 +7FF8 +C71C +C30C +830C +830C +C30C +C718 +7FF8 +3BF0 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 0445 +ENCODING 1093 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +6180 +6300 +3600 +1E00 +0C00 +1C00 +1E00 +3300 +6300 +E180 +ENDCHAR +STARTCHAR 0446 +ENCODING 1094 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 -4 +BITMAP +C100 +C100 +C100 +C100 +C100 +C100 +C100 +C100 +FF80 +FF80 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 0447 +ENCODING 1095 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +83 +83 +83 +83 +C3 +FF +7F +03 +03 +03 +ENDCHAR +STARTCHAR 0448 +ENCODING 1096 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 10 1 0 +BITMAP +C218 +C218 +C218 +C218 +C218 +C218 +C218 +C218 +FFF8 +FFF8 +ENDCHAR +STARTCHAR 0449 +ENCODING 1097 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 -4 +BITMAP +C218 +C218 +C218 +C218 +C218 +C218 +C218 +C218 +FFFC +FFFC +0004 +0004 +0004 +0004 +ENDCHAR +STARTCHAR 044A +ENCODING 1098 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +F800 +F800 +1800 +1800 +1FC0 +1FE0 +1860 +1860 +1FE0 +1FC0 +ENDCHAR +STARTCHAR 044B +ENCODING 1099 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 10 1 0 +BITMAP +C020 +C020 +C020 +FE20 +FF20 +C320 +C120 +C320 +FF20 +FE20 +ENDCHAR +STARTCHAR 044C +ENCODING 1100 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +C0 +C0 +C0 +FE +FF +C3 +C1 +C3 +FF +FE +ENDCHAR +STARTCHAR 044D +ENCODING 1101 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7C +FE +C7 +03 +1F +1F +03 +87 +FE +7C +ENDCHAR +STARTCHAR 044E +ENCODING 1102 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 10 1 0 +BITMAP +C3C0 +C7E0 +CE30 +CC10 +FC10 +FC10 +CC10 +CE30 +C7F0 +C3C0 +ENDCHAR +STARTCHAR 044F +ENCODING 1103 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7F +FF +C3 +C3 +7F +1F +73 +63 +C3 +C3 +ENDCHAR +STARTCHAR 0451 +ENCODING 1105 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 0 +BITMAP +2600 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 0452 +ENCODING 1106 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 0 -4 +BITMAP +6000 +FC00 +FC00 +6000 +6F00 +7F80 +7180 +6080 +6080 +6080 +6080 +6080 +6080 +6080 +0080 +0180 +0380 +0300 +ENDCHAR +STARTCHAR 0453 +ENCODING 1107 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 14 1 0 +BITMAP +18 +18 +30 +00 +FC +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0454 +ENCODING 1108 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +3C +7F +C3 +C0 +F8 +F8 +C0 +C3 +7F +3C +ENDCHAR +STARTCHAR 0455 +ENCODING 1109 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +7C +FE +C6 +E0 +FC +3E +03 +C3 +FE +7C +ENDCHAR +STARTCHAR 0456 +ENCODING 1110 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 0 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0457 +ENCODING 1111 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 13 0 0 +BITMAP +C8 +C8 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR 0458 +ENCODING 1112 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 18 -1 -4 +BITMAP +30 +30 +00 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +F0 +E0 +ENDCHAR +STARTCHAR 0459 +ENCODING 1113 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 17 10 0 0 +BITMAP +3FC000 +3FC000 +30C000 +30FE00 +30FF00 +30C300 +30C180 +30C300 +F0FF00 +E0FE00 +ENDCHAR +STARTCHAR 045A +ENCODING 1114 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 10 1 0 +BITMAP +C200 +C200 +C200 +C200 +FFF0 +FFF8 +C20C +C20C +C3F8 +C3F0 +ENDCHAR +STARTCHAR 045B +ENCODING 1115 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 0 0 +BITMAP +6000 +FC00 +FC00 +6000 +6F00 +7F80 +7180 +6080 +6080 +6080 +6080 +6080 +6080 +6080 +ENDCHAR +STARTCHAR 045C +ENCODING 1116 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 14 1 0 +BITMAP +18 +18 +30 +00 +C6 +CE +CC +D8 +F0 +D8 +CC +CC +C6 +C6 +ENDCHAR +STARTCHAR 045E +ENCODING 1118 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +46 +64 +38 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 045F +ENCODING 1119 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +FF +FF +08 +08 +08 +08 +ENDCHAR +STARTCHAR 0490 +ENCODING 1168 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 17 1 0 +BITMAP +03 +03 +03 +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0491 +ENCODING 1169 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 14 1 0 +BITMAP +04 +04 +04 +04 +FC +FC +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0492 +ENCODING 1170 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 14 0 0 +BITMAP +7FC0 +7FC0 +6000 +6000 +6000 +6000 +FE00 +FE00 +6000 +6000 +6000 +6000 +6000 +6000 +ENDCHAR +STARTCHAR 0493 +ENCODING 1171 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 10 0 0 +BITMAP +7E +7E +60 +F8 +F8 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 0496 +ENCODING 1174 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 17 18 0 -4 +BITMAP +E0C380 +F0C780 +38C600 +18CE00 +1CCC00 +0FF800 +07F800 +0CDC00 +18CE00 +38C600 +30C700 +70C300 +60C380 +E0C180 +000080 +000080 +000080 +000080 +ENDCHAR +STARTCHAR 0497 +ENCODING 1175 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 13 0 -3 +BITMAP +E630 +E670 +3660 +1FC0 +1FC0 +36E0 +3660 +6630 +6638 +C618 +0018 +0018 +0018 +ENDCHAR +STARTCHAR 049A +ENCODING 1178 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 18 1 -4 +BITMAP +C1C0 +C3C0 +C700 +C600 +CE00 +FC00 +FC00 +CE00 +C600 +C700 +C300 +C380 +C1C0 +C1C0 +00C0 +00C0 +00C0 +00C0 +ENDCHAR +STARTCHAR 049B +ENCODING 1179 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 13 1 -3 +BITMAP +C6 +CE +D8 +F8 +F8 +D8 +CC +CC +C6 +C6 +02 +02 +02 +ENDCHAR +STARTCHAR 049C +ENCODING 1180 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 0 +BITMAP +C1C0 +C3C0 +DF00 +DE00 +DE00 +FC00 +FC00 +DC00 +DE00 +DF00 +DB00 +DB80 +C180 +C1C0 +ENDCHAR +STARTCHAR 049D +ENCODING 1181 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 1 0 +BITMAP +C6 +DE +D8 +F8 +F8 +D8 +DC +DC +C6 +C6 +ENDCHAR +STARTCHAR 04A2 +ENCODING 1186 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 2 -4 +BITMAP +80C0 +80C0 +80C0 +80C0 +80C0 +FFC0 +FFC0 +80C0 +80C0 +80C0 +80C0 +80C0 +80E0 +80E0 +0020 +0020 +0020 +0020 +ENDCHAR +STARTCHAR 04A3 +ENCODING 1187 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +C100 +C100 +C100 +C100 +FF00 +FF00 +C100 +C100 +C180 +C180 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 04AE +ENCODING 1198 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +C0C0 +60C0 +6180 +3180 +3300 +1A00 +0E00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 04AF +ENCODING 1199 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 -4 +BITMAP +C180 +6180 +6100 +6300 +3300 +3600 +1600 +1E00 +1C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 04B0 +ENCODING 1200 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +C0C0 +60C0 +2180 +3100 +1B00 +1E00 +7FC0 +7FC0 +0C00 +0C00 +0C00 +0C00 +0C00 +0C00 +ENDCHAR +STARTCHAR 04B1 +ENCODING 1201 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 0 -4 +BITMAP +C180 +6180 +6100 +6300 +3300 +3600 +1600 +1E00 +1C00 +0C00 +7F80 +7F80 +0C00 +0C00 +ENDCHAR +STARTCHAR 04B2 +ENCODING 1202 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 -4 +BITMAP +6030 +3060 +38C0 +18C0 +0D80 +0F00 +0700 +0700 +0D80 +1DC0 +18C0 +3060 +6078 +E038 +0018 +0018 +0018 +0018 +ENDCHAR +STARTCHAR 04B3 +ENCODING 1203 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 0 -3 +BITMAP +6180 +7300 +3600 +1E00 +0C00 +1E00 +1E00 +3300 +6380 +E180 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 04B8 +ENCODING 1208 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 14 1 0 +BITMAP +C0C0 +C0C0 +C0C0 +CCC0 +CCC0 +CCC0 +EDC0 +7FC0 +3EC0 +0CC0 +0CC0 +0CC0 +00C0 +00C0 +ENDCHAR +STARTCHAR 04B9 +ENCODING 1209 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 0 +BITMAP +83 +83 +93 +D3 +FF +7F +13 +13 +03 +03 +ENDCHAR +STARTCHAR 04BA +ENCODING 1210 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +C000 +C000 +C000 +C000 +C000 +DF80 +FFC0 +E0E0 +C060 +C060 +C060 +C060 +C060 +C060 +ENDCHAR +STARTCHAR 04BB +ENCODING 1211 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +C0 +C0 +C0 +C0 +DE +FF +E3 +C1 +C1 +C1 +C1 +C1 +C1 +C1 +ENDCHAR +STARTCHAR 04D8 +ENCODING 1240 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 14 1 0 +BITMAP +0F80 +3FC0 +70E0 +6030 +6030 +0030 +FFF0 +FFF0 +C010 +C030 +6030 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 04D9 +ENCODING 1241 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +FF00 +C300 +0180 +FF80 +FF80 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 04E8 +ENCODING 1256 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +FFF8 +FFF8 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 04E9 +ENCODING 1257 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +C300 +C180 +FF80 +FF80 +8180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 05B0 +ENCODING 1456 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 3 2 -4 +BITMAP +C0 +00 +C0 +ENDCHAR +STARTCHAR 05B1 +ENCODING 1457 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 -4 +BITMAP +FC +00 +6C +ENDCHAR +STARTCHAR 05B2 +ENCODING 1458 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 -4 +BITMAP +FC +00 +0C +ENDCHAR +STARTCHAR 05B3 +ENCODING 1459 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 -4 +BITMAP +FC +60 +0C +ENDCHAR +STARTCHAR 05B4 +ENCODING 1460 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 2 -3 +BITMAP +C0 +ENDCHAR +STARTCHAR 05B5 +ENCODING 1461 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 1 1 -3 +BITMAP +D0 +ENDCHAR +STARTCHAR 05B6 +ENCODING 1462 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 3 1 -4 +BITMAP +D0 +00 +60 +ENDCHAR +STARTCHAR 05B7 +ENCODING 1463 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 1 1 -3 +BITMAP +F0 +ENDCHAR +STARTCHAR 05B8 +ENCODING 1464 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 3 1 -4 +BITMAP +F0 +20 +20 +ENDCHAR +STARTCHAR 05B9 +ENCODING 1465 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 2 11 +BITMAP +C0 +ENDCHAR +STARTCHAR 05BA +ENCODING 1466 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 2 11 +BITMAP +C0 +ENDCHAR +STARTCHAR 05BB +ENCODING 1467 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 3 0 -4 +BITMAP +C0 +30 +04 +ENDCHAR +STARTCHAR 05BC +ENCODING 1468 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 2 5 +BITMAP +C0 +ENDCHAR +STARTCHAR 05BD +ENCODING 1469 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 1 3 3 -4 +BITMAP +80 +80 +80 +ENDCHAR +STARTCHAR 05BE +ENCODING 1470 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 2 1 8 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR 05BF +ENCODING 1471 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 1 1 12 +BITMAP +F0 +ENDCHAR +STARTCHAR 05C0 +ENCODING 1472 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 1 12 2 0 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 05C1 +ENCODING 1473 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 1 7 12 +BITMAP +C0 +ENDCHAR +STARTCHAR 05C2 +ENCODING 1474 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 1 1 -2 12 +BITMAP +80 +ENDCHAR +STARTCHAR 05C3 +ENCODING 1475 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 10 2 0 +BITMAP +C0 +C0 +00 +00 +00 +00 +00 +00 +C0 +C0 +ENDCHAR +STARTCHAR 05D0 +ENCODING 1488 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +E180 +6100 +3300 +3B00 +7F00 +4E00 +C600 +C600 +C300 +C180 +ENDCHAR +STARTCHAR 05D1 +ENCODING 1489 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 10 0 0 +BITMAP +7C00 +7E00 +0700 +0300 +0100 +0100 +0100 +0100 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 05D2 +ENCODING 1490 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +78 +7C +0C +0C +0C +1C +3C +64 +66 +C6 +ENDCHAR +STARTCHAR 05D3 +ENCODING 1491 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +FF80 +FF80 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 05D4 +ENCODING 1492 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +FE00 +7F00 +0380 +0180 +C180 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR 05D5 +ENCODING 1493 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 05D6 +ENCODING 1494 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 6 10 1 0 +BITMAP +FC +FC +30 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 05D7 +ENCODING 1495 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +FE00 +FF00 +C380 +C180 +C180 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR 05D8 +ENCODING 1496 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +C700 +CF80 +C980 +C180 +C180 +C180 +C180 +6380 +7F00 +1E00 +ENDCHAR +STARTCHAR 05D9 +ENCODING 1497 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 5 1 5 +BITMAP +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 05DA +ENCODING 1498 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 -4 +BITMAP +FC +FE +07 +03 +01 +01 +01 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 05DB +ENCODING 1499 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +F0 +FC +0C +06 +06 +06 +06 +0C +FC +F0 +ENDCHAR +STARTCHAR 05DC +ENCODING 1500 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +80 +80 +80 +80 +FE +FE +06 +06 +04 +0C +18 +18 +18 +18 +ENDCHAR +STARTCHAR 05DD +ENCODING 1501 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +FE00 +FF00 +C380 +C180 +C180 +C180 +C180 +C180 +FF80 +FF80 +ENDCHAR +STARTCHAR 05DE +ENCODING 1502 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +CE00 +DF00 +7180 +6180 +6180 +6180 +4180 +4180 +CF80 +CF80 +ENDCHAR +STARTCHAR 05DF +ENCODING 1503 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 14 1 -4 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 05E0 +ENCODING 1504 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +E0 +F0 +30 +10 +10 +10 +10 +10 +F0 +F0 +ENDCHAR +STARTCHAR 05E1 +ENCODING 1505 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +E380 +C180 +C180 +C180 +C180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR 05E2 +ENCODING 1506 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 11 0 -1 +BITMAP +6180 +2180 +3180 +3180 +3180 +3180 +1300 +1700 +1E00 +FC00 +E000 +ENDCHAR +STARTCHAR 05E3 +ENCODING 1507 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +FC +FF +C3 +C3 +C1 +C1 +71 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 05E4 +ENCODING 1508 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 1 0 +BITMAP +FC00 +FE00 +C700 +C300 +C180 +7180 +0300 +8700 +FE00 +7C00 +ENDCHAR +STARTCHAR 05E5 +ENCODING 1509 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 0 -4 +BITMAP +C3 +63 +23 +33 +16 +1C +18 +18 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR 05E6 +ENCODING 1510 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +C3 +63 +33 +33 +1E +0C +04 +06 +7F +7F +ENDCHAR +STARTCHAR 05E7 +ENCODING 1511 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +FF +FF +01 +01 +43 +43 +46 +44 +44 +44 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 05E8 +ENCODING 1512 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 0 0 +BITMAP +FC +FE +07 +03 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR 05E9 +ENCODING 1513 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +C460 +C460 +C460 +CC60 +CC60 +F860 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR 05EA +ENCODING 1514 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +7F80 +7FC0 +18E0 +1860 +1860 +1860 +1860 +1860 +7860 +F060 +ENDCHAR +STARTCHAR 05F0 +ENCODING 1520 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR 05F1 +ENCODING 1521 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +C6 +C6 +C6 +C6 +C6 +06 +06 +06 +06 +06 +ENDCHAR +STARTCHAR 05F2 +ENCODING 1522 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 5 1 5 +BITMAP +C6 +C6 +C6 +C6 +C6 +ENDCHAR +STARTCHAR 05F3 +ENCODING 1523 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 4 1 6 +BITMAP +40 +C0 +C0 +80 +ENDCHAR +STARTCHAR 05F4 +ENCODING 1524 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 4 1 6 +BITMAP +4C +C8 +C8 +98 +ENDCHAR +STARTCHAR 060C +ENCODING 1548 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 6 2 3 +BITMAP +40 +80 +80 +C0 +E0 +C0 +ENDCHAR +STARTCHAR 061B +ENCODING 1563 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 9 1 3 +BITMAP +20 +40 +80 +E0 +60 +60 +00 +60 +60 +ENDCHAR +STARTCHAR 061F +ENCODING 1567 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 11 1 3 +BITMAP +70 +C8 +98 +D8 +C0 +60 +20 +20 +00 +60 +60 +ENDCHAR +STARTCHAR 0621 +ENCODING 1569 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 8 1 1 +BITMAP +30 +70 +40 +CC +FC +70 +60 +40 +ENDCHAR +STARTCHAR 0622 +ENCODING 1570 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 14 0 2 +BITMAP +F0 +00 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0623 +ENCODING 1571 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 2 +BITMAP +40 +80 +C0 +80 +00 +00 +80 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 0624 +ENCODING 1572 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +10 +0C +10 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 0625 +ENCODING 1573 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 16 0 -2 +BITMAP +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +60 +80 +60 +80 +ENDCHAR +STARTCHAR 0626 +ENCODING 1574 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 12 0 -1 +BITMAP +2000 +4000 +6060 +40F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0627 +ENCODING 1575 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 11 1 3 +BITMAP +80 +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 0628 +ENCODING 1576 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 0 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 0629 +ENCODING 1577 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 11 0 3 +BITMAP +10 +D0 +C0 +00 +20 +30 +78 +48 +48 +78 +70 +ENDCHAR +STARTCHAR 062A +ENCODING 1578 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 3 +BITMAP +0300 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 062B +ENCODING 1579 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 10 1 3 +BITMAP +0400 +0700 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 062C +ENCODING 1580 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8600 +8600 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 062D +ENCODING 1581 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 062E +ENCODING 1582 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0400 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 062F +ENCODING 1583 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 8 1 3 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 0630 +ENCODING 1584 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +40 +60 +00 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 0631 +ENCODING 1585 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 1 -2 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0632 +ENCODING 1586 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -2 +BITMAP +04 +04 +00 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0633 +ENCODING 1587 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 9 1 -1 +BITMAP +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR 0634 +ENCODING 1588 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 -1 +BITMAP +0030 +0038 +0028 +0020 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR 0635 +ENCODING 1589 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 9 1 -1 +BITMAP +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR 0636 +ENCODING 1590 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 12 1 -1 +BITMAP +000800 +000800 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR 0637 +ENCODING 1591 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 0638 +ENCODING 1592 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 0639 +ENCODING 1593 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 0 -4 +BITMAP +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR 063A +ENCODING 1594 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 20 0 -4 +BITMAP +1000 +1000 +0000 +0000 +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR 0640 +ENCODING 1600 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 2 -1 3 +BITMAP +F8 +F8 +ENDCHAR +STARTCHAR 0641 +ENCODING 1601 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 10 0 3 +BITMAP +0018 +0018 +0000 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR 0642 +ENCODING 1602 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -1 +BITMAP +0100 +0580 +0400 +0000 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR 0643 +ENCODING 1603 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 12 0 3 +BITMAP +0040 +0060 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR 0644 +ENCODING 1604 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 0 +BITMAP +0200 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR 0645 +ENCODING 1605 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 11 0 -4 +BITMAP +38 +3C +0C +3C +7C +C0 +80 +80 +40 +40 +40 +ENDCHAR +STARTCHAR 0646 +ENCODING 1606 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 -1 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR 0647 +ENCODING 1607 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 7 1 3 +BITMAP +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR 0648 +ENCODING 1608 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 0649 +ENCODING 1609 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 064A +ENCODING 1610 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0300 +0B00 +0800 +ENDCHAR +STARTCHAR 064B +ENCODING 1611 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 4 1 12 +BITMAP +60 +80 +60 +80 +ENDCHAR +STARTCHAR 064C +ENCODING 1612 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 3 5 1 12 +BITMAP +20 +60 +A0 +E0 +C0 +ENDCHAR +STARTCHAR 064D +ENCODING 1613 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 4 1 -3 +BITMAP +60 +80 +60 +80 +ENDCHAR +STARTCHAR 064E +ENCODING 1614 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 2 1 12 +BITMAP +60 +80 +ENDCHAR +STARTCHAR 064F +ENCODING 1615 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 5 1 12 +BITMAP +60 +60 +60 +60 +80 +ENDCHAR +STARTCHAR 0650 +ENCODING 1616 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 2 1 0 +BITMAP +60 +80 +ENDCHAR +STARTCHAR 0651 +ENCODING 1617 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 3 1 12 +BITMAP +40 +60 +80 +ENDCHAR +STARTCHAR 0652 +ENCODING 1618 +SWIDTH 154 0 +DWIDTH 3 0 +BBX 2 3 1 12 +BITMAP +C0 +C0 +C0 +ENDCHAR +STARTCHAR 0653 +ENCODING 1619 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 2 0 13 +BITMAP +C0 +70 +ENDCHAR +STARTCHAR 0654 +ENCODING 1620 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 4 1 13 +BITMAP +40 +80 +C0 +80 +ENDCHAR +STARTCHAR 0655 +ENCODING 1621 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 4 1 -3 +BITMAP +40 +80 +C0 +80 +ENDCHAR +STARTCHAR 0660 +ENCODING 1632 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 3 4 4 4 +BITMAP +80 +E0 +C0 +40 +ENDCHAR +STARTCHAR 0661 +ENCODING 1633 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 3 10 3 3 +BITMAP +80 +C0 +C0 +60 +60 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0662 +ENCODING 1634 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 5 11 2 3 +BITMAP +80 +C8 +F8 +78 +60 +20 +30 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 0663 +ENCODING 1635 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 4 +BITMAP +CD +7F +76 +20 +20 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 0664 +ENCODING 1636 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 4 11 3 3 +BITMAP +10 +20 +40 +80 +F0 +60 +40 +40 +C0 +F0 +70 +ENDCHAR +STARTCHAR 0665 +ENCODING 1637 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 8 2 5 +BITMAP +30 +78 +9C +84 +84 +84 +F8 +F0 +ENDCHAR +STARTCHAR 0666 +ENCODING 1638 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 11 2 3 +BITMAP +80 +F0 +F0 +10 +10 +10 +10 +18 +08 +0C +04 +ENDCHAR +STARTCHAR 0667 +ENCODING 1639 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 3 +BITMAP +81 +C1 +C3 +62 +24 +24 +18 +18 +18 +08 +ENDCHAR +STARTCHAR 0668 +ENCODING 1640 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 4 +BITMAP +10 +18 +28 +28 +24 +26 +46 +C3 +81 +81 +ENDCHAR +STARTCHAR 0669 +ENCODING 1641 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 11 2 3 +BITMAP +30 +70 +98 +88 +F8 +78 +08 +08 +08 +0C +08 +ENDCHAR +STARTCHAR 066A +ENCODING 1642 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 13 1 2 +BITMAP +63 +62 +06 +04 +0C +08 +18 +10 +30 +20 +60 +46 +C6 +ENDCHAR +STARTCHAR 066B +ENCODING 1643 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 5 2 1 +BITMAP +C0 +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR 066C +ENCODING 1644 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 3 6 2 3 +BITMAP +40 +80 +80 +C0 +E0 +C0 +ENDCHAR +STARTCHAR 066D +ENCODING 1645 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 7 2 7 +BITMAP +20 +E8 +50 +FC +70 +E8 +20 +ENDCHAR +STARTCHAR 066E +ENCODING 1646 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 6 1 3 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 066F +ENCODING 1647 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 9 1 -1 +BITMAP +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR 0670 +ENCODING 1648 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 4 0 11 +BITMAP +80 +80 +80 +80 +ENDCHAR +STARTCHAR 0671 +ENCODING 1649 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 15 0 2 +BITMAP +30 +F0 +80 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0672 +ENCODING 1650 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 15 0 2 +BITMAP +20 +40 +E0 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 0673 +ENCODING 1651 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 15 0 -1 +BITMAP +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +20 +40 +E0 +ENDCHAR +STARTCHAR 0674 +ENCODING 1652 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 4 1 13 +BITMAP +40 +80 +C0 +80 +ENDCHAR +STARTCHAR 0675 +ENCODING 1653 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 12 1 2 +BITMAP +10 +A0 +D0 +60 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 0676 +ENCODING 1654 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 9 16 0 -2 +BITMAP +0080 +0100 +0080 +0100 +0000 +0300 +0700 +0500 +0500 +0700 +0300 +0100 +0100 +0200 +8600 +7C00 +ENDCHAR +STARTCHAR 0677 +ENCODING 1655 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 9 16 0 -2 +BITMAP +0C80 +0D00 +0C80 +0D00 +1000 +0300 +0700 +0500 +0500 +0700 +0300 +0100 +0100 +0200 +8600 +7C00 +ENDCHAR +STARTCHAR 0678 +ENCODING 1656 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 15 0 -1 +BITMAP +0010 +0020 +0010 +0020 +0000 +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 0679 +ENCODING 1657 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 13 1 3 +BITMAP +0400 +0800 +0400 +0780 +0480 +1F80 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 067A +ENCODING 1658 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0400 +0400 +0600 +0200 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 067B +ENCODING 1659 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0200 +0200 +0200 +0200 +ENDCHAR +STARTCHAR 067C +ENCODING 1660 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 1 +BITMAP +0300 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0500 +0600 +ENDCHAR +STARTCHAR 067D +ENCODING 1661 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0300 +0F00 +0E00 +0200 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 067E +ENCODING 1662 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0100 +0500 +0700 +0300 +ENDCHAR +STARTCHAR 067F +ENCODING 1663 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0200 +0A00 +0900 +0D00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR 0680 +ENCODING 1664 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 12 1 -3 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0300 +0D00 +0D00 +0500 +0400 +ENDCHAR +STARTCHAR 0681 +ENCODING 1665 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 0 -4 +BITMAP +0600 +0800 +0600 +0800 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0682 +ENCODING 1666 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 0 -4 +BITMAP +0C00 +0C00 +0400 +0400 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0683 +ENCODING 1667 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8300 +8B00 +8800 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0684 +ENCODING 1668 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8400 +8400 +8600 +4600 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0685 +ENCODING 1669 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 0 -4 +BITMAP +0800 +0A00 +0A00 +0800 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0686 +ENCODING 1670 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4200 +8B00 +8A00 +8200 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0687 +ENCODING 1671 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4300 +8B00 +8D00 +8500 +4400 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 0688 +ENCODING 1672 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 15 0 3 +BITMAP +20 +20 +20 +2C +34 +FC +00 +10 +18 +0C +04 +04 +04 +7C +7C +ENDCHAR +STARTCHAR 0689 +ENCODING 1673 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 10 1 1 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +50 +30 +ENDCHAR +STARTCHAR 068A +ENCODING 1674 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 11 1 0 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +00 +20 +30 +ENDCHAR +STARTCHAR 068B +ENCODING 1675 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 18 0 0 +BITMAP +20 +20 +20 +2C +34 +FC +00 +10 +18 +0C +04 +04 +04 +7C +7C +00 +10 +18 +ENDCHAR +STARTCHAR 068C +ENCODING 1676 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +30 +D0 +C0 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 068D +ENCODING 1677 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 -1 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +00 +10 +50 +40 +ENDCHAR +STARTCHAR 068E +ENCODING 1678 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 13 1 3 +BITMAP +40 +50 +50 +40 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 068F +ENCODING 1679 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 13 1 3 +BITMAP +20 +A0 +A0 +20 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 0690 +ENCODING 1680 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 14 1 3 +BITMAP +30 +B0 +90 +50 +40 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR 0691 +ENCODING 1681 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 17 1 -2 +BITMAP +08 +10 +08 +0F +09 +3F +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0692 +ENCODING 1682 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 13 1 -2 +BITMAP +0A +04 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0693 +ENCODING 1683 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8F +7D +03 +ENDCHAR +STARTCHAR 0694 +ENCODING 1684 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +79 +01 +ENDCHAR +STARTCHAR 0695 +ENCODING 1685 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 12 1 -4 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +05 +02 +ENDCHAR +STARTCHAR 0696 +ENCODING 1686 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 11 1 -3 +BITMAP +02 +03 +01 +01 +11 +11 +01 +03 +8E +79 +01 +ENDCHAR +STARTCHAR 0697 +ENCODING 1687 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -2 +BITMAP +06 +1E +18 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0698 +ENCODING 1688 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 15 1 -2 +BITMAP +0C +0F +0B +08 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 0699 +ENCODING 1689 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 16 1 -2 +BITMAP +04 +14 +16 +1A +18 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR 069A +ENCODING 1690 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 12 1 -1 +BITMAP +0020 +0030 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8188 +FF08 +7C00 +ENDCHAR +STARTCHAR 069B +ENCODING 1691 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 10 1 -2 +BITMAP +0104 +0182 +0092 +80FE +80FE +8080 +8184 +FF14 +7C14 +0004 +ENDCHAR +STARTCHAR 069C +ENCODING 1692 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 15 1 -2 +BITMAP +0060 +0070 +0050 +0040 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8184 +FF14 +7C14 +0004 +ENDCHAR +STARTCHAR 069D +ENCODING 1693 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 9 1 -1 +BITMAP +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810100 +FF0500 +7C0400 +ENDCHAR +STARTCHAR 069E +ENCODING 1694 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 14 1 -1 +BITMAP +000400 +000500 +000500 +000400 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR 069F +ENCODING 1695 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1880 +18E0 +09E0 +0980 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 06A0 +ENCODING 1696 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 21 0 -4 +BITMAP +2000 +2800 +2800 +2000 +0000 +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR 06A1 +ENCODING 1697 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 6 0 3 +BITMAP +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR 06A2 +ENCODING 1698 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 9 0 0 +BITMAP +400C +800E +801A +C00E +7FFE +3FFE +0000 +0004 +0004 +ENDCHAR +STARTCHAR 06A3 +ENCODING 1699 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 12 0 0 +BITMAP +0008 +0008 +0000 +400C +800E +801A +C00E +7FFE +3FFE +0000 +0180 +0080 +ENDCHAR +STARTCHAR 06A4 +ENCODING 1700 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0010 +001C +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR 06A5 +ENCODING 1701 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 -2 +BITMAP +400C +800E +801A +C00E +7FFE +3FFE +0000 +0002 +000A +000A +0002 +ENDCHAR +STARTCHAR 06A6 +ENCODING 1702 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 12 0 3 +BITMAP +0004 +0014 +0014 +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR 06A7 +ENCODING 1703 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 13 1 -1 +BITMAP +0300 +0300 +0000 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR 06A8 +ENCODING 1704 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -1 +BITMAP +0400 +0700 +0500 +0400 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR 06A9 +ENCODING 1705 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0006 +001E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06AA +ENCODING 1706 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 10 0 3 +BITMAP +0080 +0380 +0E00 +1000 +1F00 +8FF8 +80FE +C002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06AB +ENCODING 1707 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0006 +001E +007A +004C +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06AC +ENCODING 1708 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 12 0 3 +BITMAP +0640 +0660 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR 06AD +ENCODING 1709 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 3 +BITMAP +0C00 +0E40 +0B60 +0860 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR 06AE +ENCODING 1710 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 17 0 -2 +BITMAP +0040 +0060 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +0000 +0300 +0F00 +0E00 +0200 +ENDCHAR +STARTCHAR 06AF +ENCODING 1711 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06B0 +ENCODING 1712 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0002 +000E +0038 +0066 +009E +007A +004C +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06B1 +ENCODING 1713 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0012 +004E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06B2 +ENCODING 1714 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 18 0 -1 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +0000 +0040 +0140 +0100 +ENDCHAR +STARTCHAR 06B3 +ENCODING 1715 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 19 0 -2 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +0000 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR 06B4 +ENCODING 1716 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0042 +001E +0078 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR 06B5 +ENCODING 1717 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 17 1 0 +BITMAP +0500 +0200 +0000 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR 06B6 +ENCODING 1718 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 17 1 0 +BITMAP +0300 +0300 +0000 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR 06B7 +ENCODING 1719 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 17 1 0 +BITMAP +0600 +0100 +0400 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR 06B8 +ENCODING 1720 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 19 1 -4 +BITMAP +0200 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +0400 +2C00 +3C00 +0C00 +ENDCHAR +STARTCHAR 06B9 +ENCODING 1721 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 -4 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +0000 +0800 +0800 +ENDCHAR +STARTCHAR 06BA +ENCODING 1722 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR 06BB +ENCODING 1723 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 1 -1 +BITMAP +1000 +1000 +1000 +1600 +1A00 +3E00 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR 06BC +ENCODING 1724 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 1 -3 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +2800 +1800 +ENDCHAR +STARTCHAR 06BD +ENCODING 1725 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 1 -1 +BITMAP +1000 +1400 +3400 +1000 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR 06BE +ENCODING 1726 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 8 -1 3 +BITMAP +08 +1C +1C +26 +27 +19 +FF +E7 +ENDCHAR +STARTCHAR 06BF +ENCODING 1727 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0400 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4200 +8B00 +8A00 +8200 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR 06C0 +ENCODING 1728 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 12 1 3 +BITMAP +60 +80 +60 +80 +00 +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR 06C1 +ENCODING 1729 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +18 +3C +6E +46 +80 +ENDCHAR +STARTCHAR 06C2 +ENCODING 1730 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 10 0 2 +BITMAP +10 +20 +10 +20 +00 +18 +3C +6E +46 +80 +ENDCHAR +STARTCHAR 06C3 +ENCODING 1731 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 9 0 2 +BITMAP +08 +28 +20 +00 +18 +3C +6E +46 +80 +ENDCHAR +STARTCHAR 06C4 +ENCODING 1732 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +01 +0D +16 +8E +7C +ENDCHAR +STARTCHAR 06C5 +ENCODING 1733 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +19 +07 +02 +86 +7C +ENDCHAR +STARTCHAR 06C6 +ENCODING 1734 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +05 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06C7 +ENCODING 1735 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -2 +BITMAP +03 +03 +03 +03 +04 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06C8 +ENCODING 1736 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -1 +BITMAP +02 +02 +02 +02 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06C9 +ENCODING 1737 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +02 +05 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06CA +ENCODING 1738 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 15 0 -2 +BITMAP +03 +0F +0C +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06CB +ENCODING 1739 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +04 +07 +0D +0C +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06CC +ENCODING 1740 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 06CD +ENCODING 1741 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 13 10 -1 -1 +BITMAP +0030 +0078 +0080 +2100 +E1F0 +40F0 +4010 +60E0 +3FC0 +1F00 +ENDCHAR +STARTCHAR 06CE +ENCODING 1742 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 11 0 -1 +BITMAP +0C00 +0860 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR 06CF +ENCODING 1743 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +04 +04 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR 06D0 +ENCODING 1744 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0000 +0400 +0400 +ENDCHAR +STARTCHAR 06D1 +ENCODING 1745 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0000 +0A00 +0600 +ENDCHAR +STARTCHAR 06D2 +ENCODING 1746 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 7 1 0 +BITMAP +0600 +0E00 +3800 +7000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR 06D3 +ENCODING 1747 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 10 1 0 +BITMAP +0800 +3000 +1800 +2600 +0E00 +3800 +7000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR 06D4 +ENCODING 1748 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 2 0 3 +BITMAP +F0 +F0 +ENDCHAR +STARTCHAR 06D5 +ENCODING 1749 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 7 1 3 +BITMAP +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR 06D6 +ENCODING 1750 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 7 -4 10 +BITMAP +20 +20 +20 +23 +7F +80 +FE +ENDCHAR +STARTCHAR 06D7 +ENCODING 1751 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 7 -3 10 +BITMAP +28 +30 +38 +24 +7C +80 +FE +ENDCHAR +STARTCHAR 06D8 +ENCODING 1752 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -2 10 +BITMAP +20 +50 +F0 +ENDCHAR +STARTCHAR 06D9 +ENCODING 1753 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 6 -2 10 +BITMAP +90 +D0 +50 +20 +60 +60 +ENDCHAR +STARTCHAR 06DA +ENCODING 1754 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 5 -2 10 +BITMAP +F0 +80 +A0 +80 +F0 +ENDCHAR +STARTCHAR 06DB +ENCODING 1755 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -1 10 +BITMAP +80 +C0 +ENDCHAR +STARTCHAR 06DC +ENCODING 1756 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 5 -4 10 +BITMAP +08 +09 +87 +88 +70 +ENDCHAR +STARTCHAR 06DD +ENCODING 1757 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 21 21 0 -4 +BITMAP +00FC00 +0F0380 +13FE80 +1C01C0 +100060 +200020 +400010 +400010 +400008 +400008 +800008 +400008 +400008 +400010 +400010 +200020 +100060 +1C01C0 +13FE80 +0F0380 +00FC00 +ENDCHAR +STARTCHAR 06DE +ENCODING 1758 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 21 0 -4 +BITMAP +002000 +005000 +008800 +1FFF80 +120480 +140280 +180180 +100080 +307040 +5090A0 +909090 +5090A0 +307040 +100080 +180180 +140280 +120480 +1FFF80 +008800 +005000 +002000 +ENDCHAR +STARTCHAR 06DF +ENCODING 1759 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 1 -1 10 +BITMAP +C0 +ENDCHAR +STARTCHAR 06E0 +ENCODING 1760 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 1 -1 10 +BITMAP +C0 +ENDCHAR +STARTCHAR 06E1 +ENCODING 1761 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 3 -3 10 +BITMAP +30 +18 +FC +ENDCHAR +STARTCHAR 06E2 +ENCODING 1762 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 5 -1 10 +BITMAP +40 +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR 06E3 +ENCODING 1763 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 8 5 -4 -4 +BITMAP +08 +09 +87 +88 +70 +ENDCHAR +STARTCHAR 06E4 +ENCODING 1764 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 1 -1 10 +BITMAP +C0 +ENDCHAR +STARTCHAR 06E5 +ENCODING 1765 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 4 1 10 +BITMAP +60 +60 +40 +C0 +ENDCHAR +STARTCHAR 06E6 +ENCODING 1766 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 4 0 10 +BITMAP +10 +70 +80 +FE +ENDCHAR +STARTCHAR 06E7 +ENCODING 1767 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 4 -4 10 +BITMAP +10 +20 +C0 +FE +ENDCHAR +STARTCHAR 06E8 +ENCODING 1768 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 6 -2 10 +BITMAP +20 +00 +10 +90 +90 +F0 +ENDCHAR +STARTCHAR 06E9 +ENCODING 1769 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 16 1 0 +BITMAP +0800 +1400 +2A00 +5580 +AA40 +D780 +7700 +5300 +5300 +5300 +5300 +5F00 +6300 +9E80 +8080 +FFC0 +ENDCHAR +STARTCHAR 06EA +ENCODING 1770 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -2 -3 +BITMAP +60 +90 +60 +ENDCHAR +STARTCHAR 06EB +ENCODING 1771 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -2 10 +BITMAP +60 +90 +60 +ENDCHAR +STARTCHAR 06EC +ENCODING 1772 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 1 -1 10 +BITMAP +C0 +ENDCHAR +STARTCHAR 06ED +ENCODING 1773 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 5 -1 -4 +BITMAP +40 +C0 +C0 +80 +80 +ENDCHAR +STARTCHAR 06F0 +ENCODING 1776 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 3 4 4 4 +BITMAP +80 +E0 +C0 +40 +ENDCHAR +STARTCHAR 06F1 +ENCODING 1777 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 3 10 3 3 +BITMAP +80 +C0 +C0 +60 +60 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 06F2 +ENCODING 1778 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 5 11 2 3 +BITMAP +80 +C8 +F8 +78 +60 +20 +30 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 06F3 +ENCODING 1779 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 4 +BITMAP +CD +7F +76 +20 +20 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 06F4 +ENCODING 1780 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 10 2 3 +BITMAP +1C +A0 +E2 +FC +78 +60 +20 +20 +20 +20 +ENDCHAR +STARTCHAR 06F5 +ENCODING 1781 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 11 1 3 +BITMAP +10 +18 +1C +1C +26 +42 +42 +42 +CA +FE +7C +ENDCHAR +STARTCHAR 06F6 +ENCODING 1782 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 11 2 3 +BITMAP +30 +78 +80 +84 +FC +F8 +30 +20 +40 +40 +40 +ENDCHAR +STARTCHAR 06F7 +ENCODING 1783 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 3 +BITMAP +81 +C1 +C3 +62 +24 +24 +18 +18 +18 +08 +ENDCHAR +STARTCHAR 06F8 +ENCODING 1784 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 1 4 +BITMAP +10 +18 +28 +28 +24 +26 +46 +C3 +81 +81 +ENDCHAR +STARTCHAR 06F9 +ENCODING 1785 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 11 2 3 +BITMAP +30 +70 +98 +88 +F8 +78 +08 +08 +08 +0C +08 +ENDCHAR +STARTCHAR 06FA +ENCODING 1786 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 -1 +BITMAP +0060 +0070 +0050 +0040 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8188 +FF08 +7C00 +ENDCHAR +STARTCHAR 06FB +ENCODING 1787 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 12 1 -1 +BITMAP +000800 +000800 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810200 +FF0200 +7C0000 +ENDCHAR +STARTCHAR 06FC +ENCODING 1788 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 20 0 -4 +BITMAP +1000 +1000 +0000 +0000 +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8200 +8200 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR 06FD +ENCODING 1789 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 12 1 -3 +BITMAP +30 +70 +40 +CC +FC +70 +60 +40 +28 +28 +28 +28 +ENDCHAR +STARTCHAR 06FE +ENCODING 1790 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 11 0 -4 +BITMAP +38 +3C +0C +3C +7C +C0 +80 +94 +54 +54 +54 +ENDCHAR +STARTCHAR 1E80 +ENCODING 7808 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 18 0 0 +BITMAP +018000 +00C000 +004000 +000000 +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 1E81 +ENCODING 7809 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +0600 +0600 +0200 +0000 +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 1E82 +ENCODING 7810 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 18 0 0 +BITMAP +006000 +004000 +00C000 +000000 +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 1E83 +ENCODING 7811 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 14 0 0 +BITMAP +0300 +0300 +0200 +0000 +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 1E84 +ENCODING 7812 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 17 0 0 +BITMAP +033000 +033000 +000000 +C0C0C0 +40C080 +61E180 +61E180 +612180 +233100 +333300 +323300 +321200 +161A00 +161E00 +1C0E00 +1C0C00 +0C0C00 +ENDCHAR +STARTCHAR 1E85 +ENCODING 7813 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 13 0 0 +BITMAP +0CC0 +0CC0 +0000 +C308 +4308 +4718 +6798 +6590 +24B0 +3CB0 +3CE0 +18E0 +1860 +ENDCHAR +STARTCHAR 1EA0 +ENCODING 7840 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 17 0 -3 +BITMAP +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EA1 +ENCODING 7841 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EA2 +ENCODING 7842 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0F00 +0100 +0300 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EA3 +ENCODING 7843 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EA4 +ENCODING 7844 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0300 +0200 +0700 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EA5 +ENCODING 7845 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EA6 +ENCODING 7846 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0C00 +0600 +0700 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EA7 +ENCODING 7847 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1000 +1800 +0000 +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EA8 +ENCODING 7848 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0700 +0300 +0700 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EA9 +ENCODING 7849 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3C00 +0400 +0C00 +0000 +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EAA +ENCODING 7850 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0C80 +1380 +0700 +0900 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EAB +ENCODING 7851 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3200 +4E00 +0000 +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EAC +ENCODING 7852 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 20 0 -3 +BITMAP +0700 +0900 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EAD +ENCODING 7853 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +3400 +2600 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EAE +ENCODING 7854 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0300 +0200 +0880 +0700 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EAF +ENCODING 7855 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +1800 +0000 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EB0 +ENCODING 7856 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0C00 +0600 +0880 +0700 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EB1 +ENCODING 7857 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1800 +0800 +0000 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EB2 +ENCODING 7858 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0700 +0300 +0880 +0700 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EB3 +ENCODING 7859 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EB4 +ENCODING 7860 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 18 0 0 +BITMAP +0E80 +1380 +0880 +0700 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +ENDCHAR +STARTCHAR 1EB5 +ENCODING 7861 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3B00 +2600 +0000 +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +ENDCHAR +STARTCHAR 1EB6 +ENCODING 7862 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 20 0 -3 +BITMAP +0880 +0700 +0000 +0600 +0700 +0F00 +0D80 +0980 +1980 +18C0 +30C0 +3FE0 +3FE0 +6060 +6030 +4030 +C038 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EB7 +ENCODING 7863 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +2200 +2200 +1C00 +0000 +3E00 +7F00 +C300 +0F00 +7F00 +F100 +C300 +C700 +FF00 +7D80 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EB8 +ENCODING 7864 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 17 1 -3 +BITMAP +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EB9 +ENCODING 7865 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EBA +ENCODING 7866 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +0300 +0600 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EBB +ENCODING 7867 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EBC +ENCODING 7868 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1C80 +1F80 +1300 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EBD +ENCODING 7869 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +3A00 +3E00 +6E00 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EBE +ENCODING 7870 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0600 +0400 +0E00 +1B00 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EBF +ENCODING 7871 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EC0 +ENCODING 7872 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0800 +0400 +0E00 +1B00 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EC1 +ENCODING 7873 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1000 +1800 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EC2 +ENCODING 7874 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +0E00 +0600 +0E00 +1B00 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EC3 +ENCODING 7875 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3C00 +0400 +0C00 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EC4 +ENCODING 7876 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 18 1 0 +BITMAP +1D00 +2700 +0E00 +1B00 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 1EC5 +ENCODING 7877 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3200 +4E00 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EC6 +ENCODING 7878 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 20 1 -3 +BITMAP +0E00 +1B00 +0000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFC0 +FFC0 +C000 +C000 +C000 +C000 +FFE0 +FFE0 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EC7 +ENCODING 7879 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +FF80 +FF80 +C000 +C380 +7F00 +3E00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EC8 +ENCODING 7880 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 18 1 0 +BITMAP +E0 +30 +70 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 1EC9 +ENCODING 7881 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 14 0 0 +BITMAP +F0 +10 +30 +00 +60 +60 +60 +60 +60 +60 +60 +60 +60 +60 +ENDCHAR +STARTCHAR 1ECA +ENCODING 7882 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 17 2 -3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR 1ECB +ENCODING 7883 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 17 1 -3 +BITMAP +C0 +C0 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +00 +C0 +C0 +ENDCHAR +STARTCHAR 1ECC +ENCODING 7884 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 17 1 -3 +BITMAP +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1ECD +ENCODING 7885 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1ECE +ENCODING 7886 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0700 +0180 +0300 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ECF +ENCODING 7887 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED0 +ENCODING 7888 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0300 +0200 +0700 +0D80 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ED1 +ENCODING 7889 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED2 +ENCODING 7890 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0400 +0200 +0700 +0D80 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ED3 +ENCODING 7891 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3000 +1000 +1800 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED4 +ENCODING 7892 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0700 +0300 +0700 +0D80 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ED5 +ENCODING 7893 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 18 1 0 +BITMAP +3C00 +0400 +0C00 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED6 +ENCODING 7894 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 18 1 0 +BITMAP +0E40 +1380 +0700 +0D80 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1ED7 +ENCODING 7895 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 0 +BITMAP +3200 +4E00 +0000 +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +ENDCHAR +STARTCHAR 1ED8 +ENCODING 7896 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 20 1 -3 +BITMAP +0700 +0D80 +0000 +0F80 +3FE0 +7070 +6030 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1ED9 +ENCODING 7897 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +3400 +2600 +0000 +3C00 +7F00 +C300 +C180 +8180 +8180 +C180 +C300 +7F00 +3C00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EDA +ENCODING 7898 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0300 +0300 +0600 +0000 +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1EDB +ENCODING 7899 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +0C00 +0C00 +0800 +0000 +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EDC +ENCODING 7900 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0C00 +0600 +0200 +0000 +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1EDD +ENCODING 7901 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +3000 +1800 +0800 +0000 +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EDE +ENCODING 7902 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0700 +0180 +0300 +0000 +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1EDF +ENCODING 7903 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +1C00 +0600 +0C00 +0000 +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EE0 +ENCODING 7904 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 18 1 0 +BITMAP +0EC0 +0F80 +1B80 +0000 +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +ENDCHAR +STARTCHAR 1EE1 +ENCODING 7905 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 14 1 0 +BITMAP +3200 +7E00 +4E00 +0000 +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +ENDCHAR +STARTCHAR 1EE2 +ENCODING 7906 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 17 1 -3 +BITMAP +0F86 +3FE6 +7072 +6034 +C018 +C018 +C018 +C018 +C018 +C018 +6030 +7070 +3FE0 +0F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EE3 +ENCODING 7907 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 13 1 -3 +BITMAP +3C60 +7F60 +C320 +C1C0 +81C0 +8180 +C180 +C300 +7F00 +3E00 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EE4 +ENCODING 7908 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 17 1 -3 +BITMAP +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EE5 +ENCODING 7909 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 13 1 -3 +BITMAP +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +00 +18 +18 +ENDCHAR +STARTCHAR 1EE6 +ENCODING 7910 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 18 1 0 +BITMAP +0E00 +0300 +0700 +0000 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EE7 +ENCODING 7911 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 0 +BITMAP +3C +04 +0C +00 +C1 +C1 +C1 +C1 +C1 +C1 +C3 +C3 +7D +39 +ENDCHAR +STARTCHAR 1EE8 +ENCODING 7912 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0300 +0600 +0400 +0000 +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EE9 +ENCODING 7913 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +0C00 +0C00 +1800 +0000 +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 1EEA +ENCODING 7914 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0C00 +0400 +0600 +0000 +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EEB +ENCODING 7915 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +3000 +1800 +0800 +0000 +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 1EEC +ENCODING 7916 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0E00 +0300 +0700 +0000 +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EED +ENCODING 7917 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +3C00 +0400 +0C00 +0000 +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 1EEE +ENCODING 7918 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 18 1 0 +BITMAP +0C80 +1F80 +1300 +0000 +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 1EEF +ENCODING 7919 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 14 1 0 +BITMAP +3200 +7E00 +6E00 +0000 +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +ENDCHAR +STARTCHAR 1EF0 +ENCODING 7920 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 17 1 -3 +BITMAP +C064 +C064 +C064 +C064 +C078 +C060 +C060 +C060 +4060 +4060 +6060 +70E0 +3FC0 +1F80 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EF1 +ENCODING 7921 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 -3 +BITMAP +C160 +C160 +C120 +C120 +C1C0 +C100 +C300 +C300 +7D00 +3900 +0000 +1800 +1800 +ENDCHAR +STARTCHAR 1EF2 +ENCODING 7922 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0C00 +0600 +0200 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EF3 +ENCODING 7923 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +30 +10 +18 +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 1EF4 +ENCODING 7924 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 17 0 -3 +BITMAP +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +0000 +0600 +0600 +ENDCHAR +STARTCHAR 1EF5 +ENCODING 7925 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +36 +F6 +E0 +ENDCHAR +STARTCHAR 1EF6 +ENCODING 7926 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0F00 +0100 +0300 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EF7 +ENCODING 7927 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +38 +04 +1C +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 1EF8 +ENCODING 7928 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 12 18 0 0 +BITMAP +0EC0 +0F80 +1B80 +0000 +E030 +6070 +3060 +30C0 +1880 +0D80 +0F00 +0600 +0600 +0600 +0600 +0600 +0600 +0600 +ENDCHAR +STARTCHAR 1EF9 +ENCODING 7929 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 18 1 -4 +BITMAP +32 +7E +4C +00 +83 +C3 +C2 +46 +66 +64 +3C +3C +18 +18 +10 +30 +F0 +E0 +ENDCHAR +STARTCHAR 200C +ENCODING 8204 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 15 0 -3 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 200D +ENCODING 8205 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 16 -2 -2 +BITMAP +90 +E0 +D0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 200E +ENCODING 8206 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 15 0 -3 +BITMAP +20 +F0 +A0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 200F +ENCODING 8207 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 15 -4 -3 +BITMAP +40 +F0 +50 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 2013 +ENCODING 8211 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 2 0 4 +BITMAP +FFE0 +FFE0 +ENDCHAR +STARTCHAR 2014 +ENCODING 8212 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 19 2 0 4 +BITMAP +FFFFE0 +FFFFE0 +ENDCHAR +STARTCHAR 2015 +ENCODING 8213 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 2 1 4 +BITMAP +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR 2017 +ENCODING 8215 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 5 0 -6 +BITMAP +FFE0 +FFE0 +0000 +FFE0 +FFE0 +ENDCHAR +STARTCHAR 2018 +ENCODING 8216 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +40 +C0 +80 +C0 +C0 +ENDCHAR +STARTCHAR 2019 +ENCODING 8217 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR 201A +ENCODING 8218 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 -3 +BITMAP +C0 +C0 +40 +40 +80 +ENDCHAR +STARTCHAR 201B +ENCODING 8219 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 5 1 9 +BITMAP +C0 +C0 +80 +C0 +40 +ENDCHAR +STARTCHAR 201C +ENCODING 8220 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 5 1 9 +BITMAP +50 +90 +90 +D0 +D0 +ENDCHAR +STARTCHAR 201D +ENCODING 8221 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 5 1 9 +BITMAP +D0 +D0 +50 +90 +90 +ENDCHAR +STARTCHAR 201E +ENCODING 8222 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 5 1 -3 +BITMAP +D0 +D0 +50 +90 +90 +ENDCHAR +STARTCHAR 2020 +ENCODING 8224 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +1800 +1800 +1800 +FF80 +FF80 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +1800 +ENDCHAR +STARTCHAR 2021 +ENCODING 8225 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 17 1 -3 +BITMAP +1800 +1800 +1800 +1800 +FF80 +FF80 +1800 +1800 +1800 +1800 +1800 +FF80 +FF80 +1800 +1800 +1800 +1800 +ENDCHAR +STARTCHAR 2022 +ENCODING 8226 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 5 1 4 +BITMAP +70 +F8 +F8 +F8 +70 +ENDCHAR +STARTCHAR 2026 +ENCODING 8230 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 15 2 2 0 +BITMAP +C106 +C106 +ENDCHAR +STARTCHAR 202A +ENCODING 8234 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 14 0 -3 +BITMAP +F0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 202B +ENCODING 8235 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 14 -4 -3 +BITMAP +F0 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 202C +ENCODING 8236 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 16 -2 -3 +BITMAP +F0 +F0 +F0 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 202D +ENCODING 8237 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +F0 +80 +80 +80 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 202E +ENCODING 8238 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +F0 +10 +10 +10 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 2030 +ENCODING 8240 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 19 14 0 0 +BITMAP +78C000 +488000 +CC8000 +CD0000 +CD0000 +4B0000 +7A0000 +02E3C0 +059240 +059660 +0D1660 +099660 +099240 +10E3C0 +ENDCHAR +STARTCHAR 2032 +ENCODING 8242 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 5 1 9 +BITMAP +60 +C0 +C0 +C0 +80 +ENDCHAR +STARTCHAR 2033 +ENCODING 8243 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 5 1 9 +BITMAP +78 +58 +D8 +D0 +90 +ENDCHAR +STARTCHAR 2039 +ENCODING 8249 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 9 1 1 +BITMAP +30 +20 +60 +40 +C0 +40 +60 +20 +30 +ENDCHAR +STARTCHAR 203A +ENCODING 8250 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 9 1 1 +BITMAP +C0 +40 +60 +20 +30 +20 +60 +40 +C0 +ENDCHAR +STARTCHAR 203C +ENCODING 8252 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 6 14 2 0 +BITMAP +CC +CC +CC +CC +CC +CC +CC +8C +8C +88 +88 +00 +CC +CC +ENDCHAR +STARTCHAR 203E +ENCODING 8254 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 7 2 0 11 +BITMAP +FE +FE +ENDCHAR +STARTCHAR 2044 +ENCODING 8260 +SWIDTH 154 0 +DWIDTH 3 0 +BBX 11 14 -4 0 +BITMAP +0020 +0040 +00C0 +0180 +0100 +0200 +0600 +0400 +0800 +1800 +3000 +2000 +4000 +C000 +ENDCHAR +STARTCHAR 206A +ENCODING 8298 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +F0 +40 +40 +40 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206B +ENCODING 8299 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +F0 +90 +90 +90 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206C +ENCODING 8300 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 16 -2 -3 +BITMAP +F0 +60 +60 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206D +ENCODING 8301 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 16 -2 -3 +BITMAP +40 +60 +60 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206E +ENCODING 8302 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +40 +60 +90 +60 +60 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 206F +ENCODING 8303 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 17 -2 -3 +BITMAP +C0 +40 +40 +40 +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR 207F +ENCODING 8319 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 7 1 5 +BITMAP +B0 +F8 +88 +88 +88 +88 +88 +ENDCHAR +STARTCHAR 20A3 +ENCODING 8355 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +3FC0 +3FC0 +2000 +2000 +2000 +2000 +3F80 +3F80 +2000 +2000 +FC00 +FC00 +2000 +2000 +ENDCHAR +STARTCHAR 20A4 +ENCODING 8356 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +1F00 +3F80 +3180 +60C0 +6000 +FE00 +FE00 +3000 +FE00 +FE00 +3000 +7C40 +FFC0 +4380 +ENDCHAR +STARTCHAR 20A7 +ENCODING 8359 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 14 0 0 +BITMAP +FE0000 +FF3000 +C3B000 +C1B000 +C1FFC0 +C3FFF0 +FFB430 +FE3700 +C037E0 +C031F0 +C03030 +C03630 +C03FF0 +C03BE0 +ENDCHAR +STARTCHAR 20AA +ENCODING 8362 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 10 1 0 +BITMAP +FF18 +FF98 +C098 +CC98 +CC98 +CC98 +CC98 +CC18 +CFF8 +CFF0 +ENDCHAR +STARTCHAR 20AB +ENCODING 8363 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 11 1 3 +BITMAP +0E +04 +3C +44 +44 +C4 +44 +44 +3C +00 +FE +ENDCHAR +STARTCHAR 20AC +ENCODING 8364 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 0 0 +BITMAP +0780 +1FC0 +3840 +3000 +6000 +6000 +FF80 +6000 +FF80 +6000 +3000 +3840 +1FC0 +0780 +ENDCHAR +STARTCHAR 2105 +ENCODING 8453 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 15 14 1 0 +BITMAP +7820 +CC60 +8040 +80C0 +8480 +C980 +7900 +033C +0244 +0642 +04C2 +0842 +0844 +103C +ENDCHAR +STARTCHAR 2113 +ENCODING 8467 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 14 1 0 +BITMAP +30 +78 +48 +48 +50 +50 +60 +60 +C0 +C0 +40 +40 +78 +78 +ENDCHAR +STARTCHAR 2116 +ENCODING 8470 +SWIDTH 1028 0 +DWIDTH 20 0 +BBX 19 14 1 0 +BITMAP +E06000 +E06000 +F06000 +F06780 +D86FC0 +CC6C40 +CC6C60 +C66C40 +C76FC0 +C36780 +C1E000 +C1EFC0 +C0EFC0 +C06000 +ENDCHAR +STARTCHAR 2122 +ENCODING 8482 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 15 8 2 6 +BITMAP +FD86 +118E +114E +114E +1156 +1136 +1136 +1136 +ENDCHAR +STARTCHAR 2126 +ENCODING 8486 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 13 14 1 0 +BITMAP +0F80 +3FE0 +7060 +6030 +6030 +C030 +C010 +C010 +6030 +6030 +3060 +18C0 +FDF8 +FDF8 +ENDCHAR +STARTCHAR 212E +ENCODING 8494 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 10 1 0 +BITMAP +3E00 +6100 +C180 +C180 +FFC0 +C000 +C000 +C080 +6100 +3E00 +ENDCHAR +STARTCHAR 2153 +ENCODING 8531 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 0 +BITMAP +2010 +6030 +E020 +A040 +20C0 +2180 +2100 +023C +0664 +0C04 +0818 +1006 +3066 +603C +ENDCHAR +STARTCHAR 2154 +ENCODING 8532 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +7808 +4C18 +0C10 +1820 +3060 +60C0 +FC80 +011E +0332 +0602 +040C +0802 +1822 +301E +ENDCHAR +STARTCHAR 215B +ENCODING 8539 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +2010 +6030 +A020 +2040 +20C0 +2180 +2100 +0238 +0664 +0C64 +0838 +1044 +3044 +603C +ENDCHAR +STARTCHAR 215C +ENCODING 8540 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +7808 +4C18 +0C10 +1020 +0C60 +CCC0 +7880 +011E +0332 +0632 +041C +0822 +1822 +301E +ENDCHAR +STARTCHAR 215D +ENCODING 8541 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 0 0 +BITMAP +7C08 +4018 +7810 +4C20 +0460 +CCC0 +7880 +011E +0332 +0632 +041C +0822 +1822 +301E +ENDCHAR +STARTCHAR 215E +ENCODING 8542 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 14 14 1 0 +BITMAP +F810 +1020 +3060 +2040 +6080 +4180 +4300 +0238 +0464 +0C64 +1838 +1044 +2044 +603C +ENDCHAR +STARTCHAR 2190 +ENCODING 8592 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 6 1 1 +BITMAP +100000 +200000 +600000 +FFFF80 +600000 +100000 +ENDCHAR +STARTCHAR 2191 +ENCODING 8593 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 16 1 -4 +BITMAP +10 +38 +7C +D2 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +ENDCHAR +STARTCHAR 2192 +ENCODING 8594 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 6 1 1 +BITMAP +000400 +000200 +000300 +FFFF80 +000200 +000400 +ENDCHAR +STARTCHAR 2193 +ENCODING 8595 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 16 1 -4 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +90 +56 +3C +18 +10 +ENDCHAR +STARTCHAR 2194 +ENCODING 8596 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 17 7 1 1 +BITMAP +100400 +200200 +600300 +FFFF80 +600300 +100400 +100400 +ENDCHAR +STARTCHAR 2195 +ENCODING 8597 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 18 1 -4 +BITMAP +10 +18 +38 +74 +92 +10 +10 +10 +10 +10 +10 +10 +10 +90 +56 +3C +18 +10 +ENDCHAR +STARTCHAR 21A8 +ENCODING 8616 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 7 20 1 -6 +BITMAP +10 +18 +38 +74 +92 +10 +10 +10 +10 +10 +10 +10 +10 +90 +56 +3C +18 +10 +00 +FE +ENDCHAR +STARTCHAR 2202 +ENCODING 8706 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +0E +1E +33 +21 +01 +0F +3D +61 +C3 +82 +86 +CC +FC +70 +ENDCHAR +STARTCHAR 2206 +ENCODING 8710 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 12 0 1 +BITMAP +0600 +0600 +0A00 +0B00 +1100 +1180 +2180 +20C0 +20C0 +4040 +4060 +FFE0 +ENDCHAR +STARTCHAR 220F +ENCODING 8719 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 13 18 1 -4 +BITMAP +FFF8 +FFF8 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +C018 +ENDCHAR +STARTCHAR 2211 +ENCODING 8721 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 18 1 -4 +BITMAP +FFF0 +FFF0 +6000 +3000 +3800 +1800 +0C00 +0600 +0300 +0700 +0600 +0C00 +1800 +3000 +6000 +6000 +FFF0 +FFF0 +ENDCHAR +STARTCHAR 2212 +ENCODING 8722 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 2 1 6 +BITMAP +FF80 +FF80 +ENDCHAR +STARTCHAR 2215 +ENCODING 8725 +SWIDTH 154 0 +DWIDTH 3 0 +BBX 11 14 -4 0 +BITMAP +0020 +0040 +00C0 +0180 +0100 +0200 +0600 +0400 +0800 +1800 +3000 +2000 +4000 +C000 +ENDCHAR +STARTCHAR 2219 +ENCODING 8729 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 2 2 6 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR 221A +ENCODING 8730 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 18 1 -1 +BITMAP +0080 +0080 +0080 +0080 +0080 +0080 +0100 +2100 +E100 +3100 +1900 +1900 +0E00 +0E00 +0600 +0600 +0200 +0200 +ENDCHAR +STARTCHAR 221E +ENCODING 8734 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 6 1 4 +BITMAP +71C0 +7BE0 +CE20 +CE20 +7BE0 +71C0 +ENDCHAR +STARTCHAR 221F +ENCODING 8735 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 12 12 3 0 +BITMAP +8000 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +8000 +FFF0 +ENDCHAR +STARTCHAR 2229 +ENCODING 8745 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 14 1 0 +BITMAP +0F00 +3FC0 +70C0 +6060 +4020 +4020 +C020 +C020 +C020 +C020 +C020 +C020 +C020 +C020 +ENDCHAR +STARTCHAR 222B +ENCODING 8747 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 19 0 -2 +BITMAP +18 +38 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +20 +E0 +C0 +ENDCHAR +STARTCHAR 2248 +ENCODING 8776 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 7 0 3 +BITMAP +7C40 +FFC0 +8780 +0000 +7C40 +FFC0 +8780 +ENDCHAR +STARTCHAR 2260 +ENCODING 8800 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 14 1 0 +BITMAP +0300 +0200 +0200 +0400 +FF80 +FF80 +0800 +1800 +FF80 +FF80 +2000 +2000 +4000 +4000 +ENDCHAR +STARTCHAR 2261 +ENCODING 8801 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 2 +BITMAP +FF80 +FF80 +0000 +0000 +FF80 +FF80 +0000 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR 2264 +ENCODING 8804 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 0 +BITMAP +0080 +0780 +1E00 +7000 +C000 +7000 +1E00 +0780 +0080 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR 2265 +ENCODING 8805 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 0 +BITMAP +8000 +E000 +7800 +0F00 +0180 +0F00 +7800 +E000 +8000 +0000 +FF80 +FF80 +ENDCHAR +STARTCHAR 2302 +ENCODING 8962 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 1 +BITMAP +0C00 +1200 +2100 +4100 +8080 +8080 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR 2310 +ENCODING 8976 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 6 1 4 +BITMAP +FF80 +FF80 +C000 +C000 +C000 +C000 +ENDCHAR +STARTCHAR 2320 +ENCODING 8992 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 4 21 5 -5 +BITMAP +70 +10 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR 2321 +ENCODING 8993 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 4 21 2 -5 +BITMAP +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +10 +D0 +60 +ENDCHAR +STARTCHAR 2500 +ENCODING 9472 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 2 0 5 +BITMAP +FFFC +FFFC +ENDCHAR +STARTCHAR 2502 +ENCODING 9474 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 2 23 4 -6 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 250C +ENCODING 9484 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 13 6 -6 +BITMAP +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 2510 +ENCODING 9488 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 13 0 -6 +BITMAP +FF +FF +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR 2514 +ENCODING 9492 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 12 6 5 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +FF +ENDCHAR +STARTCHAR 2518 +ENCODING 9496 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 12 0 5 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +FF +FF +ENDCHAR +STARTCHAR 251C +ENCODING 9500 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 23 6 -6 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 2524 +ENCODING 9508 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 23 0 -6 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +FF +FF +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR 252C +ENCODING 9516 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 13 0 -6 +BITMAP +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 2534 +ENCODING 9524 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 12 0 5 +BITMAP +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +FFFC +FFFC +ENDCHAR +STARTCHAR 253C +ENCODING 9532 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 2550 +ENCODING 9552 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 5 0 3 +BITMAP +FFFC +0000 +0000 +FFFC +FFFC +ENDCHAR +STARTCHAR 2551 +ENCODING 9553 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 5 23 4 -6 +BITMAP +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +C8 +ENDCHAR +STARTCHAR 2552 +ENCODING 9554 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 14 6 -6 +BITMAP +FF +C0 +C0 +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 2553 +ENCODING 9555 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 13 4 -6 +BITMAP +FFC0 +FFC0 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +ENDCHAR +STARTCHAR 2554 +ENCODING 9556 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 14 4 -6 +BITMAP +FFC0 +C000 +C000 +CFC0 +CFC0 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +ENDCHAR +STARTCHAR 2555 +ENCODING 9557 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 14 0 -6 +BITMAP +FF +03 +03 +FF +FF +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR 2556 +ENCODING 9558 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 13 0 -6 +BITMAP +FF80 +FF80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2557 +ENCODING 9559 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 14 0 -6 +BITMAP +FF80 +0080 +0080 +FC80 +FC80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2558 +ENCODING 9560 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 14 6 3 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +C0 +C0 +FF +FF +ENDCHAR +STARTCHAR 2559 +ENCODING 9561 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 12 4 5 +BITMAP +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 255A +ENCODING 9562 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 14 4 3 +BITMAP +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +CFC0 +C000 +C000 +FFC0 +FFC0 +ENDCHAR +STARTCHAR 255B +ENCODING 9563 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 14 0 3 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +FF +03 +03 +FF +FF +ENDCHAR +STARTCHAR 255C +ENCODING 9564 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 12 0 5 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FF80 +FF80 +ENDCHAR +STARTCHAR 255D +ENCODING 9565 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 14 0 3 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FC80 +0080 +0080 +FF80 +FF80 +ENDCHAR +STARTCHAR 255E +ENCODING 9566 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 23 6 -6 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +FF +C0 +C0 +FF +FF +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR 255F +ENCODING 9567 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 23 4 -6 +BITMAP +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +CFC0 +CFC0 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +ENDCHAR +STARTCHAR 2560 +ENCODING 9568 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 10 23 4 -6 +BITMAP +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +CFC0 +C000 +C000 +CFC0 +CFC0 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +C800 +ENDCHAR +STARTCHAR 2561 +ENCODING 9569 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 8 23 0 -6 +BITMAP +03 +03 +03 +03 +03 +03 +03 +03 +03 +FF +03 +03 +FF +FF +03 +03 +03 +03 +03 +03 +03 +03 +03 +ENDCHAR +STARTCHAR 2562 +ENCODING 9570 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 23 0 -6 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FC80 +FC80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2563 +ENCODING 9571 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 9 23 0 -6 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FC80 +0080 +0080 +FC80 +FC80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2564 +ENCODING 9572 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 14 0 -6 +BITMAP +FFFC +0000 +0000 +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 2565 +ENCODING 9573 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 13 0 -6 +BITMAP +FFFC +FFFC +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2566 +ENCODING 9574 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 14 0 -6 +BITMAP +FFFC +0000 +0000 +FCFC +FCFC +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2567 +ENCODING 9575 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 14 0 3 +BITMAP +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +FFFC +0000 +0000 +FFFC +FFFC +ENDCHAR +STARTCHAR 2568 +ENCODING 9576 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 12 0 5 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FFFC +FFFC +ENDCHAR +STARTCHAR 2569 +ENCODING 9577 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 14 0 3 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FCFC +0000 +0000 +FFFC +FFFC +ENDCHAR +STARTCHAR 256A +ENCODING 9578 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +FFFC +0300 +0300 +FFFC +FFFC +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR 256B +ENCODING 9579 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FFFC +FFFC +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 256C +ENCODING 9580 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +FCFC +0000 +0000 +FCFC +FCFC +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +0C80 +ENDCHAR +STARTCHAR 2580 +ENCODING 9600 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 11 0 6 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 2584 +ENCODING 9604 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 12 0 -6 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 2588 +ENCODING 9608 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 23 0 -6 +BITMAP +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +FFFC +ENDCHAR +STARTCHAR 258C +ENCODING 9612 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 7 23 0 -6 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR 2590 +ENCODING 9616 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 7 23 7 -6 +BITMAP +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +FE +ENDCHAR +STARTCHAR 2591 +ENCODING 9617 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 13 22 1 -5 +BITMAP +8440 +0000 +2118 +0000 +8440 +0000 +0000 +2118 +0000 +8440 +0000 +2118 +0000 +0000 +8440 +0000 +2118 +0000 +8440 +0000 +0000 +2118 +ENDCHAR +STARTCHAR 2592 +ENCODING 9618 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 14 22 0 -5 +BITMAP +52A4 +0000 +AD58 +0000 +52A4 +0000 +0000 +AD58 +0000 +52A4 +0000 +AD58 +0000 +0000 +52A4 +0000 +AD58 +0000 +52A4 +0000 +0000 +AD58 +ENDCHAR +STARTCHAR 2593 +ENCODING 9619 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 14 23 0 -6 +BITMAP +5AB4 +FFFC +A548 +FFFC +5AB4 +FFFC +FFFC +A548 +FFFC +5AB4 +FFFC +A548 +FFFC +FFFC +5AB4 +FFFC +A548 +FFFC +5AB4 +FFFC +FFFC +A548 +FFFC +ENDCHAR +STARTCHAR 25A0 +ENCODING 9632 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 25A1 +ENCODING 9633 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +FF80 +8080 +8080 +8080 +8080 +8080 +8080 +8080 +FF80 +ENDCHAR +STARTCHAR 25AA +ENCODING 9642 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 4 1 4 +BITMAP +F8 +F8 +F8 +F8 +ENDCHAR +STARTCHAR 25AB +ENCODING 9643 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 4 1 4 +BITMAP +88 +88 +88 +F8 +ENDCHAR +STARTCHAR 25AC +ENCODING 9644 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 19 4 0 3 +BITMAP +FFFFE0 +FFFFE0 +FFFFE0 +FFFFE0 +ENDCHAR +STARTCHAR 25B2 +ENCODING 9650 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 13 13 3 0 +BITMAP +0200 +0200 +0700 +0700 +0F80 +0F80 +1FC0 +1FC0 +3FE0 +3FE0 +7FF0 +7FF0 +FFF8 +ENDCHAR +STARTCHAR 25BA +ENCODING 9658 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 13 13 3 0 +BITMAP +8000 +E000 +F800 +FE00 +FF80 +FFE0 +FFF8 +FFE0 +FF80 +FE00 +F800 +E000 +8000 +ENDCHAR +STARTCHAR 25BC +ENCODING 9660 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 13 13 3 0 +BITMAP +FFF8 +7FF0 +7FF0 +3FE0 +3FE0 +1FC0 +1FC0 +0F80 +0F80 +0700 +0700 +0200 +0200 +ENDCHAR +STARTCHAR 25C4 +ENCODING 9668 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 13 13 3 0 +BITMAP +0008 +0038 +00F8 +03F8 +0FF8 +3FF8 +FFF8 +3FF8 +0FF8 +03F8 +00F8 +0038 +0008 +ENDCHAR +STARTCHAR 25CA +ENCODING 9674 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 0 +BITMAP +10 +28 +28 +44 +42 +82 +81 +81 +82 +42 +44 +28 +28 +10 +ENDCHAR +STARTCHAR 25CB +ENCODING 9675 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 8 2 1 +BITMAP +44 +82 +81 +01 +01 +80 +42 +38 +ENDCHAR +STARTCHAR 25CF +ENCODING 9679 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 8 2 1 +BITMAP +7C +FE +FF +FF +FF +FE +7E +38 +ENDCHAR +STARTCHAR 25D8 +ENCODING 9688 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 9 1 0 +BITMAP +FF80 +FF80 +FF80 +E380 +E180 +E380 +FF80 +FF80 +FF80 +ENDCHAR +STARTCHAR 25D9 +ENCODING 9689 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 11 0 0 +BITMAP +FFE0 +FFE0 +E6E0 +DF60 +DFA0 +FFA0 +FFA0 +DFE0 +EF60 +F1E0 +FFE0 +ENDCHAR +STARTCHAR 25E6 +ENCODING 9702 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 5 5 1 4 +BITMAP +20 +90 +88 +88 +70 +ENDCHAR +STARTCHAR 263A +ENCODING 9786 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 12 12 4 -1 +BITMAP +0E00 +3080 +4040 +8020 +91A0 +9190 +8010 +8000 +9120 +4E20 +20C0 +1F00 +ENDCHAR +STARTCHAR 263B +ENCODING 9787 +SWIDTH 1028 0 +DWIDTH 20 0 +BBX 12 12 4 -1 +BITMAP +0F00 +3FC0 +7FE0 +7FE0 +EF70 +EF70 +FFF0 +FFF0 +7FE0 +70E0 +3FC0 +1F80 +ENDCHAR +STARTCHAR 263C +ENCODING 9788 +SWIDTH 874 0 +DWIDTH 17 0 +BBX 17 17 0 -2 +BITMAP +008000 +008000 +208200 +11E400 +0C1800 +080800 +000400 +100400 +F00780 +100400 +000400 +080800 +0C1800 +11E400 +208200 +008000 +008000 +ENDCHAR +STARTCHAR 2640 +ENCODING 9792 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 10 14 2 -4 +BITMAP +1E00 +0080 +0000 +8040 +8040 +8040 +0040 +4000 +2000 +0E00 +0000 +0000 +0000 +7FC0 +ENDCHAR +STARTCHAR 2642 +ENCODING 9794 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 12 17 1 -2 +BITMAP +0060 +0160 +0440 +0000 +0090 +0010 +0100 +0000 +2300 +4080 +8000 +8040 +8040 +8040 +8000 +4080 +2100 +ENDCHAR +STARTCHAR 2660 +ENCODING 9824 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 1 1 +BITMAP +1800 +3C00 +7E00 +FF00 +FF00 +FF80 +E700 +0000 +1800 +3E00 +ENDCHAR +STARTCHAR 2663 +ENCODING 9827 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 11 1 0 +BITMAP +1E00 +1F00 +1F00 +7EC0 +FFE0 +FFE0 +FFE0 +F3C0 +0400 +0C00 +3F00 +ENDCHAR +STARTCHAR 2665 +ENCODING 9829 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 11 1 0 +BITMAP +F780 +FFC0 +FFC0 +FF80 +7F80 +7F00 +3E00 +1E00 +1C00 +0800 +0800 +ENDCHAR +STARTCHAR 2666 +ENCODING 9830 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 11 1 0 +BITMAP +10 +18 +3C +7E +FE +FF +FE +7C +3C +18 +10 +ENDCHAR +STARTCHAR 266A +ENCODING 9834 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 0 0 +BITMAP +0600 +0780 +0380 +0080 +0080 +0000 +0000 +0000 +0000 +7800 +F800 +F800 +7800 +ENDCHAR +STARTCHAR 266B +ENCODING 9835 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 11 15 1 -1 +BITMAP +0060 +03E0 +0FE0 +0E20 +0820 +0820 +0820 +0820 +0820 +09E0 +0BE0 +FBE0 +F9E0 +F800 +F000 +ENDCHAR +STARTCHAR E801 +ENCODING 59393 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 12 -1 0 +BITMAP +C0 +00 +30 +30 +30 +30 +30 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR E802 +ENCODING 59394 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 -4 +BITMAP +FC +FE +07 +03 +01 +01 +01 +31 +01 +31 +01 +01 +01 +01 +ENDCHAR +STARTCHAR E803 +ENCODING 59395 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 -4 +BITMAP +FC +FE +07 +03 +01 +01 +01 +79 +11 +11 +01 +01 +01 +01 +ENDCHAR +STARTCHAR E804 +ENCODING 59396 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 10 14 -2 0 +BITMAP +1000 +D000 +1000 +1000 +1FC0 +1FC0 +00C0 +00C0 +0080 +0180 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR E805 +ENCODING 59397 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 10 14 -2 0 +BITMAP +1000 +D000 +1000 +1000 +1FC0 +1FC0 +00C0 +0CC0 +0080 +0180 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR E818 +ENCODING 59416 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 7 1 12 +BITMAP +60 +80 +60 +80 +40 +60 +80 +ENDCHAR +STARTCHAR E83A +ENCODING 59450 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 13 2 -1 3 +BITMAP +FFF8 +FFF8 +ENDCHAR +STARTCHAR F001 +ENCODING 61441 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +1D +3D +30 +20 +F9 +F9 +21 +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR F002 +ENCODING 61442 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +1D +3D +31 +21 +F9 +F9 +21 +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR F004 +ENCODING 61444 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 2 4 2 -5 +BITMAP +C0 +C0 +40 +80 +ENDCHAR +STARTCHAR F005 +ENCODING 61445 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 3 1 -4 +BITMAP +70 +30 +E0 +ENDCHAR +STARTCHAR F006 +ENCODING 61446 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 2 -4 16 +BITMAP +60 +C0 +ENDCHAR +STARTCHAR F007 +ENCODING 61447 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 16 +BITMAP +C0 +80 +ENDCHAR +STARTCHAR F008 +ENCODING 61448 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -3 11 +BITMAP +60 +40 +C0 +ENDCHAR +STARTCHAR F009 +ENCODING 61449 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -6 15 +BITMAP +60 +40 +C0 +ENDCHAR +STARTCHAR F00A +ENCODING 61450 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 21 0 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +00 +00 +00 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR F00B +ENCODING 61451 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 21 -2 -4 +BITMAP +F0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +F0 +ENDCHAR +STARTCHAR F00C +ENCODING 61452 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 21 0 -4 +BITMAP +80 +C0 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +ENDCHAR +STARTCHAR F00D +ENCODING 61453 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 21 -2 -4 +BITMAP +40 +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR F00E +ENCODING 61454 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 21 0 -4 +BITMAP +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +C0 +ENDCHAR +STARTCHAR F00F +ENCODING 61455 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 3 -8 11 +BITMAP +C0 +60 +20 +ENDCHAR +STARTCHAR F010 +ENCODING 61456 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 2 -5 16 +BITMAP +F0 +30 +ENDCHAR +STARTCHAR F011 +ENCODING 61457 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 3 2 -8 16 +BITMAP +E0 +60 +ENDCHAR +STARTCHAR F012 +ENCODING 61458 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -4 11 +BITMAP +E0 +30 +70 +ENDCHAR +STARTCHAR F013 +ENCODING 61459 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -7 15 +BITMAP +E0 +30 +70 +ENDCHAR +STARTCHAR F014 +ENCODING 61460 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 4 3 -7 11 +BITMAP +E0 +30 +70 +ENDCHAR +STARTCHAR F015 +ENCODING 61461 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 2 -10 16 +BITMAP +72 +9C +ENDCHAR +STARTCHAR F016 +ENCODING 61462 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -10 15 +BITMAP +64 +9C +ENDCHAR +STARTCHAR F017 +ENCODING 61463 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -12 15 +BITMAP +64 +9C +ENDCHAR +STARTCHAR F018 +ENCODING 61464 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 7 2 -13 15 +BITMAP +76 +DC +ENDCHAR +STARTCHAR F019 +ENCODING 61465 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -8 11 +BITMAP +EC +98 +ENDCHAR +STARTCHAR F01A +ENCODING 61466 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -10 11 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F01B +ENCODING 61467 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -11 11 +BITMAP +64 +9C +ENDCHAR +STARTCHAR F01C +ENCODING 61468 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -6 15 +BITMAP +74 +DC +ENDCHAR +STARTCHAR F01D +ENCODING 61469 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -5 11 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F01E +ENCODING 61470 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F01F +ENCODING 61471 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -8 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F020 +ENCODING 61472 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -10 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F021 +ENCODING 61473 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -8 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F022 +ENCODING 61474 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 1 2 -10 -3 +BITMAP +80 +80 +ENDCHAR +STARTCHAR F023 +ENCODING 61475 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -6 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F024 +ENCODING 61476 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -6 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F025 +ENCODING 61477 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -6 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F026 +ENCODING 61478 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -8 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F027 +ENCODING 61479 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F028 +ENCODING 61480 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -9 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F029 +ENCODING 61481 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -4 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F02A +ENCODING 61482 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -3 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F02B +ENCODING 61483 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -7 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F02C +ENCODING 61484 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 2 2 -2 -3 +BITMAP +C0 +C0 +ENDCHAR +STARTCHAR F02D +ENCODING 61485 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -9 16 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F02E +ENCODING 61486 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -9 15 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F02F +ENCODING 61487 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -10 16 +BITMAP +E4 +98 +ENDCHAR +STARTCHAR F030 +ENCODING 61488 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -10 15 +BITMAP +EC +98 +ENDCHAR +STARTCHAR F031 +ENCODING 61489 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 10 1 0 +BITMAP +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR FB01 +ENCODING 64257 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +1D +3D +30 +20 +F9 +F9 +21 +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR FB02 +ENCODING 64258 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 0 +BITMAP +1D +3D +31 +21 +F9 +F9 +21 +21 +21 +21 +21 +21 +21 +21 +ENDCHAR +STARTCHAR FB1D +ENCODING 64285 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 8 1 2 +BITMAP +C0 +C0 +C0 +C0 +C0 +00 +00 +40 +ENDCHAR +STARTCHAR FB1E +ENCODING 64286 +SWIDTH 0 0 +DWIDTH 0 0 +BBX 6 2 -3 12 +BITMAP +CC +78 +ENDCHAR +STARTCHAR FB1F +ENCODING 64287 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 7 1 3 +BITMAP +C6 +C6 +C6 +C6 +C6 +00 +FE +ENDCHAR +STARTCHAR FB20 +ENCODING 64288 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +6180 +2180 +3180 +3180 +3180 +3180 +1300 +1B00 +FE00 +FC00 +ENDCHAR +STARTCHAR FB2A +ENCODING 64298 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +0020 +0000 +0000 +C460 +C460 +C460 +CC60 +CC60 +F860 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB2B +ENCODING 64299 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +C000 +0000 +0000 +C460 +C460 +C460 +CC60 +CC60 +F860 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB2C +ENCODING 64300 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +0020 +0000 +0000 +C460 +C460 +C460 +CC60 +CC60 +FB60 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB2D +ENCODING 64301 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 13 1 0 +BITMAP +C000 +0000 +0000 +C460 +C460 +C460 +CC60 +CC60 +FB60 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB2E +ENCODING 64302 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 13 1 -3 +BITMAP +E180 +6100 +3300 +3B00 +7F00 +4E00 +C600 +C600 +C300 +C180 +0000 +0000 +3C00 +ENDCHAR +STARTCHAR FB2F +ENCODING 64303 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 15 1 -5 +BITMAP +E180 +6100 +3300 +3B00 +7F00 +4E00 +C600 +C600 +C300 +C180 +0000 +0000 +3C00 +0800 +0800 +ENDCHAR +STARTCHAR FB30 +ENCODING 64304 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +E180 +6100 +3300 +3B00 +7F00 +4E00 +C600 +C600 +DB00 +C180 +ENDCHAR +STARTCHAR FB31 +ENCODING 64305 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 10 0 0 +BITMAP +7C00 +7E00 +0700 +0300 +3100 +0100 +0100 +0100 +FFC0 +FFC0 +ENDCHAR +STARTCHAR FB32 +ENCODING 64306 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 7 10 0 0 +BITMAP +78 +7C +0C +3C +0C +1C +3C +64 +66 +C6 +ENDCHAR +STARTCHAR FB33 +ENCODING 64307 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 0 0 +BITMAP +FF80 +FF80 +0300 +1B00 +0300 +0300 +0300 +0300 +0300 +0300 +ENDCHAR +STARTCHAR FB34 +ENCODING 64308 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +FE00 +7F00 +0380 +0180 +C980 +C180 +C180 +C180 +C180 +C180 +ENDCHAR +STARTCHAR FB35 +ENCODING 64309 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 10 0 0 +BITMAP +30 +30 +30 +30 +F0 +30 +30 +30 +30 +30 +ENDCHAR +STARTCHAR FB36 +ENCODING 64310 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 10 0 0 +BITMAP +3F +3F +0C +D8 +18 +18 +18 +18 +18 +18 +ENDCHAR +STARTCHAR FB38 +ENCODING 64312 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +C700 +CF80 +C980 +C180 +CD80 +C180 +C180 +6380 +7F00 +1E00 +ENDCHAR +STARTCHAR FB39 +ENCODING 64313 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 5 0 5 +BITMAP +30 +30 +F0 +30 +30 +ENDCHAR +STARTCHAR FB3A +ENCODING 64314 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 0 -4 +BITMAP +FC +FE +07 +03 +11 +01 +01 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR FB3B +ENCODING 64315 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 10 1 0 +BITMAP +F0 +FC +0C +06 +66 +06 +06 +0C +FC +F0 +ENDCHAR +STARTCHAR FB3C +ENCODING 64316 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 14 1 0 +BITMAP +80 +80 +80 +80 +FE +FE +06 +26 +04 +0C +18 +18 +18 +18 +ENDCHAR +STARTCHAR FB3E +ENCODING 64318 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +CE00 +DF00 +7180 +6180 +6D80 +6180 +4180 +4180 +CF80 +CF80 +ENDCHAR +STARTCHAR FB40 +ENCODING 64320 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 4 10 1 0 +BITMAP +E0 +F0 +30 +10 +90 +10 +10 +10 +F0 +F0 +ENDCHAR +STARTCHAR FB41 +ENCODING 64321 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 10 1 0 +BITMAP +3E00 +7F00 +E380 +C180 +C980 +C180 +C180 +E380 +7F00 +3E00 +ENDCHAR +STARTCHAR FB43 +ENCODING 64323 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 8 14 1 -4 +BITMAP +FC +FF +C3 +C3 +C1 +CD +61 +01 +01 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR FB44 +ENCODING 64324 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 10 1 0 +BITMAP +FC00 +FE00 +C700 +C300 +C180 +6D80 +0300 +8700 +FE00 +7C00 +ENDCHAR +STARTCHAR FB46 +ENCODING 64326 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 0 0 +BITMAP +C3 +63 +33 +33 +7E +0C +04 +06 +7F +7F +ENDCHAR +STARTCHAR FB47 +ENCODING 64327 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 14 1 -4 +BITMAP +FF +FF +01 +19 +43 +43 +46 +44 +44 +44 +40 +40 +40 +40 +ENDCHAR +STARTCHAR FB48 +ENCODING 64328 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 8 10 0 0 +BITMAP +FC +FE +07 +03 +11 +01 +01 +01 +01 +01 +ENDCHAR +STARTCHAR FB49 +ENCODING 64329 +SWIDTH 668 0 +DWIDTH 13 0 +BBX 11 10 1 0 +BITMAP +C460 +C460 +C460 +CC60 +CC60 +FB60 +40C0 +61C0 +3F80 +1F00 +ENDCHAR +STARTCHAR FB4A +ENCODING 64330 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 10 0 0 +BITMAP +7F80 +7FC0 +18E0 +1860 +1B60 +1860 +1860 +1860 +7860 +F060 +ENDCHAR +STARTCHAR FB4B +ENCODING 64331 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 2 13 1 0 +BITMAP +40 +00 +00 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +ENDCHAR +STARTCHAR FB4C +ENCODING 64332 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 13 0 0 +BITMAP +1C00 +0000 +0000 +7C00 +7E00 +0700 +0300 +0100 +0100 +0100 +0100 +FFC0 +FFC0 +ENDCHAR +STARTCHAR FB4D +ENCODING 64333 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 7 13 1 0 +BITMAP +78 +00 +00 +F0 +FC +0C +06 +06 +06 +06 +0C +FC +F0 +ENDCHAR +STARTCHAR FB4E +ENCODING 64334 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 1 0 +BITMAP +3C00 +0000 +0000 +FC00 +FE00 +C700 +C300 +C180 +7180 +0300 +8700 +FE00 +7C00 +ENDCHAR +STARTCHAR FB4F +ENCODING 64335 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 14 1 0 +BITMAP +8000 +8000 +8000 +8000 +E180 +E180 +3180 +3B00 +7F00 +6E00 +4600 +4700 +C300 +C180 +ENDCHAR +STARTCHAR FB50 +ENCODING 64336 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 15 0 2 +BITMAP +30 +F0 +80 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR FB51 +ENCODING 64337 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 14 -1 3 +BITMAP +30 +F0 +00 +00 +60 +20 +20 +20 +20 +20 +20 +20 +18 +18 +ENDCHAR +STARTCHAR FB52 +ENCODING 64338 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0200 +0200 +0200 +0200 +ENDCHAR +STARTCHAR FB53 +ENCODING 64339 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0200 +0200 +0200 +0200 +ENDCHAR +STARTCHAR FB54 +ENCODING 64340 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +30 +30 +10 +10 +ENDCHAR +STARTCHAR FB55 +ENCODING 64341 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +30 +30 +10 +10 +ENDCHAR +STARTCHAR FB56 +ENCODING 64342 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0100 +0500 +0700 +0300 +ENDCHAR +STARTCHAR FB57 +ENCODING 64343 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 -2 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0100 +0500 +0700 +0300 +ENDCHAR +STARTCHAR FB58 +ENCODING 64344 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +38 +18 +ENDCHAR +STARTCHAR FB59 +ENCODING 64345 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +38 +18 +ENDCHAR +STARTCHAR FB5A +ENCODING 64346 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 12 1 -3 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0300 +0D00 +0D00 +0500 +0400 +ENDCHAR +STARTCHAR FB5B +ENCODING 64347 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 12 1 -3 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0300 +0D00 +0D00 +0500 +0400 +ENDCHAR +STARTCHAR FB5C +ENCODING 64348 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 -3 +BITMAP +08 +08 +0C +04 +FC +FC +00 +18 +68 +68 +28 +20 +ENDCHAR +STARTCHAR FB5D +ENCODING 64349 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 -3 +BITMAP +08 +08 +0C +04 +FC +FC +00 +18 +68 +68 +28 +20 +ENDCHAR +STARTCHAR FB5E +ENCODING 64350 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0400 +0400 +0600 +0200 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB5F +ENCODING 64351 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0400 +0400 +0600 +0200 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB60 +ENCODING 64352 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +20 +20 +30 +10 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB61 +ENCODING 64353 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +20 +20 +30 +10 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB62 +ENCODING 64354 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0200 +0A00 +0900 +0D00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB63 +ENCODING 64355 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 11 1 3 +BITMAP +0200 +0A00 +0900 +0D00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB64 +ENCODING 64356 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +50 +48 +68 +60 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB65 +ENCODING 64357 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +50 +48 +68 +60 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB66 +ENCODING 64358 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 13 1 3 +BITMAP +0400 +0800 +0400 +0780 +0480 +1F80 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB67 +ENCODING 64359 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 13 1 3 +BITMAP +0400 +0800 +0400 +0780 +0480 +1F80 +0000 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FB68 +ENCODING 64360 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +20 +20 +20 +2C +34 +7C +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB69 +ENCODING 64361 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +20 +20 +20 +2C +34 +7C +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FB6A +ENCODING 64362 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0010 +001C +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FB6B +ENCODING 64363 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0010 +001C +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FB6C +ENCODING 64364 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 3 +BITMAP +20 +38 +78 +60 +18 +38 +2C +3C +3C +04 +FC +FC +ENDCHAR +STARTCHAR FB6D +ENCODING 64365 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 3 +BITMAP +20 +28 +68 +20 +18 +1C +24 +24 +1C +0C +FC +FC +ENDCHAR +STARTCHAR FB6E +ENCODING 64366 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 12 0 3 +BITMAP +0004 +0014 +0014 +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FB6F +ENCODING 64367 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 12 0 3 +BITMAP +0004 +0014 +0014 +0014 +0010 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FB70 +ENCODING 64368 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 14 -1 3 +BITMAP +10 +50 +48 +68 +60 +00 +18 +38 +2C +3C +3C +04 +FC +FC +ENDCHAR +STARTCHAR FB71 +ENCODING 64369 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 14 -1 3 +BITMAP +10 +50 +48 +68 +60 +00 +18 +1C +24 +24 +1C +0C +FC +FC +ENDCHAR +STARTCHAR FB72 +ENCODING 64370 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8400 +8400 +8600 +4600 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB73 +ENCODING 64371 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8800 +8800 +8C00 +4C00 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB74 +ENCODING 64372 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 -2 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0400 +0400 +0600 +0600 +ENDCHAR +STARTCHAR FB75 +ENCODING 64373 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 -2 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0400 +0400 +0600 +0600 +ENDCHAR +STARTCHAR FB76 +ENCODING 64374 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8300 +8B00 +8800 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB77 +ENCODING 64375 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8400 +9400 +9000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB78 +ENCODING 64376 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 -1 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0800 +ENDCHAR +STARTCHAR FB79 +ENCODING 64377 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 -1 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0800 +ENDCHAR +STARTCHAR FB7A +ENCODING 64378 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4200 +8B00 +8A00 +8200 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB7B +ENCODING 64379 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8400 +9400 +9400 +4400 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB7C +ENCODING 64380 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 -2 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0E00 +0200 +ENDCHAR +STARTCHAR FB7D +ENCODING 64381 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 -2 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0E00 +0200 +ENDCHAR +STARTCHAR FB7E +ENCODING 64382 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4300 +8B00 +8D00 +8500 +4400 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB7F +ENCODING 64383 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +45C0 +9400 +9600 +9E00 +5800 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FB80 +ENCODING 64384 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 12 -1 -3 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0B00 +0D00 +0C00 +ENDCHAR +STARTCHAR FB81 +ENCODING 64385 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 12 -1 -3 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0200 +0A00 +0B00 +0D00 +0C00 +ENDCHAR +STARTCHAR FB82 +ENCODING 64386 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 -1 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +00 +10 +50 +40 +ENDCHAR +STARTCHAR FB83 +ENCODING 64387 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 -1 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +00 +10 +50 +40 +ENDCHAR +STARTCHAR FB84 +ENCODING 64388 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +30 +D0 +C0 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FB85 +ENCODING 64389 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +30 +D0 +C0 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FB86 +ENCODING 64390 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 13 1 3 +BITMAP +40 +50 +50 +40 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FB87 +ENCODING 64391 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 13 1 3 +BITMAP +40 +50 +50 +40 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FB88 +ENCODING 64392 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 15 0 3 +BITMAP +20 +20 +20 +2C +34 +FC +00 +10 +18 +0C +04 +04 +04 +7C +7C +ENDCHAR +STARTCHAR FB89 +ENCODING 64393 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 15 0 3 +BITMAP +20 +20 +20 +2C +34 +FC +00 +10 +18 +0C +04 +04 +04 +7C +7C +ENDCHAR +STARTCHAR FB8A +ENCODING 64394 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 15 1 -2 +BITMAP +0C +0F +0B +08 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FB8B +ENCODING 64395 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 15 1 -2 +BITMAP +0C +0F +0B +08 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FB8C +ENCODING 64396 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 17 1 -2 +BITMAP +08 +10 +08 +0F +09 +3F +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FB8D +ENCODING 64397 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 17 1 -2 +BITMAP +08 +10 +08 +0F +09 +3F +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FB8E +ENCODING 64398 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 11 0 3 +BITMAP +0006 +001E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR FB8F +ENCODING 64399 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 11 0 3 +BITMAP +000600 +001E00 +007800 +004000 +006000 +007000 +001800 +800C00 +801200 +FFF3C0 +7FE1C0 +ENDCHAR +STARTCHAR FB90 +ENCODING 64400 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 11 -1 3 +BITMAP +03 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FB91 +ENCODING 64401 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 11 -1 3 +BITMAP +0300 +0F00 +3C00 +2000 +3000 +3800 +0C00 +0600 +0900 +F9E0 +F0E0 +ENDCHAR +STARTCHAR FB92 +ENCODING 64402 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR FB93 +ENCODING 64403 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 14 0 3 +BITMAP +000200 +000E00 +003800 +006600 +009E00 +007800 +004000 +006000 +007000 +001800 +800C00 +801200 +FFF3C0 +7FE1C0 +ENDCHAR +STARTCHAR FB94 +ENCODING 64404 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 14 -1 3 +BITMAP +01 +07 +1C +33 +4F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FB95 +ENCODING 64405 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 14 -1 3 +BITMAP +0100 +0700 +1C00 +3300 +4F00 +3C00 +2000 +3000 +3800 +0C00 +0600 +0900 +F9E0 +F0E0 +ENDCHAR +STARTCHAR FB96 +ENCODING 64406 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 19 0 -2 +BITMAP +0002 +000E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +0000 +0080 +0080 +0080 +0080 +ENDCHAR +STARTCHAR FB97 +ENCODING 64407 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 19 0 -2 +BITMAP +000200 +000E00 +003800 +006600 +009E00 +007800 +004000 +006000 +007000 +001800 +800C00 +801200 +FFF3C0 +7FE1C0 +000000 +020000 +020000 +020000 +020000 +ENDCHAR +STARTCHAR FB98 +ENCODING 64408 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 19 -1 -2 +BITMAP +01 +07 +1C +33 +4F +3C +20 +30 +38 +0C +02 +01 +FF +FF +00 +08 +08 +0C +0C +ENDCHAR +STARTCHAR FB99 +ENCODING 64409 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 19 -1 -2 +BITMAP +0100 +0700 +1C00 +3300 +4F00 +3C00 +2000 +3000 +3800 +0C00 +0600 +0900 +F9E0 +F0E0 +0000 +3000 +3000 +1000 +1000 +ENDCHAR +STARTCHAR FB9A +ENCODING 64410 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 14 0 3 +BITMAP +0012 +004E +0038 +0066 +009E +0078 +0040 +0060 +0070 +0018 +8004 +8002 +FFFE +7FFE +ENDCHAR +STARTCHAR FB9B +ENCODING 64411 +SWIDTH 925 0 +DWIDTH 18 0 +BBX 18 14 0 3 +BITMAP +001200 +004E00 +003800 +006600 +009E00 +007800 +004000 +006000 +007000 +001800 +800C00 +801200 +FFF3C0 +7FE1C0 +ENDCHAR +STARTCHAR FB9C +ENCODING 64412 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 14 -1 3 +BITMAP +09 +27 +1C +33 +4F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FB9D +ENCODING 64413 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 14 -1 3 +BITMAP +0900 +2700 +1C00 +3300 +4F00 +3C00 +2000 +3000 +3800 +0C00 +0600 +0900 +F9E0 +F0E0 +ENDCHAR +STARTCHAR FB9E +ENCODING 64414 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FB9F +ENCODING 64415 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 8 1 0 +BITMAP +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FBA0 +ENCODING 64416 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 1 -1 +BITMAP +1000 +1000 +1000 +1600 +1A00 +3E00 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FBA1 +ENCODING 64417 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 1 -1 +BITMAP +1000 +1000 +1000 +1600 +1A00 +3E00 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FBA2 +ENCODING 64418 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +20 +20 +20 +2C +34 +7C +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FBA3 +ENCODING 64419 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +20 +20 +20 +2C +34 +7C +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FBA4 +ENCODING 64420 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 12 1 3 +BITMAP +60 +80 +60 +80 +00 +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR FBA5 +ENCODING 64421 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 13 0 3 +BITMAP +30 +40 +30 +40 +10 +10 +28 +48 +F8 +E8 +08 +06 +06 +ENDCHAR +STARTCHAR FBA6 +ENCODING 64422 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 7 1 3 +BITMAP +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR FBA7 +ENCODING 64423 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 5 0 2 +BITMAP +18 +3C +6E +46 +80 +ENDCHAR +STARTCHAR FBA8 +ENCODING 64424 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +10 +20 +30 +10 +ENDCHAR +STARTCHAR FBA9 +ENCODING 64425 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 7 12 -1 -4 +BITMAP +10 +10 +10 +F6 +DE +18 +10 +00 +08 +10 +08 +08 +ENDCHAR +STARTCHAR FBAA +ENCODING 64426 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 8 -1 3 +BITMAP +08 +1C +1C +26 +27 +19 +FF +E7 +ENDCHAR +STARTCHAR FBAB +ENCODING 64427 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 9 0 4 +BITMAP +10 +10 +28 +48 +F8 +E8 +08 +06 +06 +ENDCHAR +STARTCHAR FBAC +ENCODING 64428 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 8 -1 3 +BITMAP +08 +1C +1C +26 +27 +19 +FF +E7 +ENDCHAR +STARTCHAR FBAD +ENCODING 64429 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 10 -1 -1 +BITMAP +04 +0C +14 +18 +FF +FF +24 +34 +1E +0C +ENDCHAR +STARTCHAR FBAE +ENCODING 64430 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 7 1 0 +BITMAP +0600 +0E00 +3800 +7000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR FBAF +ENCODING 64431 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 9 1 -4 +BITMAP +00FC +07FC +1F00 +3800 +6000 +8000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR FBB0 +ENCODING 64432 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 10 1 0 +BITMAP +0800 +3000 +1800 +2600 +0E00 +3800 +7000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR FBB1 +ENCODING 64433 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 14 14 1 -4 +BITMAP +0020 +0040 +0020 +0040 +0000 +00FC +07FC +1F00 +3800 +6000 +8000 +8000 +FFFC +FFF8 +ENDCHAR +STARTCHAR FBD3 +ENCODING 64467 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 3 +BITMAP +0C00 +0E40 +0B60 +0860 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR FBD4 +ENCODING 64468 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 3 +BITMAP +0C00 +0E40 +0B60 +0860 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR FBD5 +ENCODING 64469 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 13 -1 3 +BITMAP +30 +0C +23 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FBD6 +ENCODING 64470 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 13 -1 3 +BITMAP +30 +0C +23 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FBD7 +ENCODING 64471 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -2 +BITMAP +03 +03 +03 +03 +04 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBD8 +ENCODING 64472 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -2 +BITMAP +03 +03 +03 +03 +04 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBD9 +ENCODING 64473 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +05 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDA +ENCODING 64474 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +05 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDB +ENCODING 64475 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -1 +BITMAP +02 +02 +02 +02 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDC +ENCODING 64476 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 17 0 -1 +BITMAP +02 +02 +02 +02 +02 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDD +ENCODING 64477 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 9 16 0 -2 +BITMAP +0C80 +0D00 +0C80 +0D00 +1000 +0300 +0700 +0500 +0500 +0700 +0300 +0100 +0100 +0200 +8600 +7C00 +ENDCHAR +STARTCHAR FBDE +ENCODING 64478 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +04 +07 +0D +0C +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBDF +ENCODING 64479 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +04 +07 +0D +0C +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBE0 +ENCODING 64480 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +19 +07 +02 +86 +7C +ENDCHAR +STARTCHAR FBE1 +ENCODING 64481 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +19 +07 +02 +86 +7C +ENDCHAR +STARTCHAR FBE2 +ENCODING 64482 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +02 +05 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBE3 +ENCODING 64483 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 14 0 -2 +BITMAP +02 +05 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FBE4 +ENCODING 64484 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0000 +0400 +0400 +ENDCHAR +STARTCHAR FBE5 +ENCODING 64485 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 9 0 -4 +BITMAP +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +0400 +0400 +ENDCHAR +STARTCHAR FBE6 +ENCODING 64486 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +30 +30 +10 +10 +ENDCHAR +STARTCHAR FBE7 +ENCODING 64487 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 -2 +BITMAP +08 +08 +0C +04 +FC +FC +00 +30 +30 +10 +10 +ENDCHAR +STARTCHAR FBFC +ENCODING 64508 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR FBFD +ENCODING 64509 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 7 0 -2 +BITMAP +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +ENDCHAR +STARTCHAR FBFE +ENCODING 64510 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 -1 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +20 +ENDCHAR +STARTCHAR FBFF +ENCODING 64511 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 -1 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +20 +ENDCHAR +STARTCHAR FC5E +ENCODING 64606 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 8 0 12 +BITMAP +10 +30 +50 +F0 +40 +20 +30 +40 +ENDCHAR +STARTCHAR FC5F +ENCODING 64607 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 7 1 12 +BITMAP +40 +60 +80 +60 +80 +60 +80 +ENDCHAR +STARTCHAR FC60 +ENCODING 64608 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 5 1 12 +BITMAP +60 +80 +40 +60 +80 +ENDCHAR +STARTCHAR FC61 +ENCODING 64609 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 7 1 12 +BITMAP +60 +60 +60 +80 +40 +60 +80 +ENDCHAR +STARTCHAR FC62 +ENCODING 64610 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 5 1 12 +BITMAP +40 +60 +80 +60 +80 +ENDCHAR +STARTCHAR FD3E +ENCODING 64830 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 19 1 -4 +BITMAP +10 +10 +20 +60 +60 +60 +C0 +C0 +C0 +C0 +C0 +C0 +C0 +40 +60 +60 +20 +10 +10 +ENDCHAR +STARTCHAR FD3F +ENCODING 64831 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 4 19 1 -4 +BITMAP +80 +80 +40 +60 +60 +20 +30 +30 +30 +30 +30 +30 +30 +20 +60 +60 +40 +80 +80 +ENDCHAR +STARTCHAR FDF2 +ENCODING 65010 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 11 13 0 3 +BITMAP +0200 +0000 +0080 +0580 +0600 +0100 +0120 +0920 +1920 +2920 +49A0 +FFE0 +E760 +ENDCHAR +STARTCHAR FE80 +ENCODING 65152 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 6 8 1 1 +BITMAP +30 +70 +40 +CC +FC +70 +60 +40 +ENDCHAR +STARTCHAR FE81 +ENCODING 65153 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 14 0 2 +BITMAP +F0 +00 +00 +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +ENDCHAR +STARTCHAR FE82 +ENCODING 65154 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 13 0 3 +BITMAP +E0 +00 +00 +C0 +40 +40 +40 +40 +40 +40 +40 +30 +30 +ENDCHAR +STARTCHAR FE83 +ENCODING 65155 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 14 1 2 +BITMAP +40 +80 +C0 +80 +00 +00 +80 +C0 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR FE84 +ENCODING 65156 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 13 0 3 +BITMAP +40 +80 +60 +80 +00 +40 +C0 +40 +40 +40 +40 +70 +30 +ENDCHAR +STARTCHAR FE85 +ENCODING 65157 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +10 +0C +10 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FE86 +ENCODING 65158 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 16 0 -2 +BITMAP +0C +10 +0C +10 +00 +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FE87 +ENCODING 65159 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 3 16 0 -2 +BITMAP +40 +60 +20 +20 +20 +20 +20 +20 +20 +20 +20 +00 +60 +80 +60 +80 +ENDCHAR +STARTCHAR FE88 +ENCODING 65160 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 15 0 -1 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +30 +30 +00 +40 +80 +60 +80 +ENDCHAR +STARTCHAR FE89 +ENCODING 65161 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 12 0 -1 +BITMAP +2000 +4000 +6060 +40F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR FE8A +ENCODING 65162 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 13 0 -2 +BITMAP +2000 +4000 +6000 +4000 +0000 +0000 +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +ENDCHAR +STARTCHAR FE8B +ENCODING 65163 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +20 +10 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE8C +ENCODING 65164 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +20 +10 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE8D +ENCODING 65165 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 2 11 1 3 +BITMAP +80 +C0 +40 +40 +40 +40 +40 +40 +40 +40 +40 +ENDCHAR +STARTCHAR FE8E +ENCODING 65166 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 4 10 0 4 +BITMAP +C0 +40 +40 +40 +40 +40 +40 +40 +30 +30 +ENDCHAR +STARTCHAR FE8F +ENCODING 65167 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 0 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0600 +0600 +ENDCHAR +STARTCHAR FE90 +ENCODING 65168 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 0 +BITMAP +8010 +8010 +8010 +8008 +FFF8 +7FF8 +0000 +0600 +0600 +ENDCHAR +STARTCHAR FE91 +ENCODING 65169 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 9 -1 0 +BITMAP +08 +08 +0C +04 +FC +FC +00 +10 +10 +ENDCHAR +STARTCHAR FE92 +ENCODING 65170 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 9 -1 0 +BITMAP +08 +08 +0C +04 +FC +FC +00 +10 +10 +ENDCHAR +STARTCHAR FE93 +ENCODING 65171 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 5 11 0 3 +BITMAP +10 +D0 +C0 +00 +20 +30 +78 +48 +48 +78 +70 +ENDCHAR +STARTCHAR FE94 +ENCODING 65172 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 14 0 3 +BITMAP +10 +50 +40 +00 +00 +10 +10 +28 +48 +F8 +E8 +08 +06 +06 +ENDCHAR +STARTCHAR FE95 +ENCODING 65173 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 3 +BITMAP +0300 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FE96 +ENCODING 65174 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 9 1 3 +BITMAP +0300 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FE97 +ENCODING 65175 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 3 +BITMAP +08 +28 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE98 +ENCODING 65176 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 3 +BITMAP +08 +28 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE99 +ENCODING 65177 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 10 1 3 +BITMAP +0400 +0700 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FE9A +ENCODING 65178 +SWIDTH 720 0 +DWIDTH 14 0 +BBX 13 10 1 3 +BITMAP +0400 +0700 +0F00 +0C00 +8010 +8010 +8010 +8008 +FFF8 +7FF8 +ENDCHAR +STARTCHAR FE9B +ENCODING 65179 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +20 +28 +28 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE9C +ENCODING 65180 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +20 +28 +28 +20 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FE9D +ENCODING 65181 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8600 +8600 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FE9E +ENCODING 65182 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8000 +8400 +8400 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FE9F +ENCODING 65183 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 9 -1 0 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0400 +0400 +ENDCHAR +STARTCHAR FEA0 +ENCODING 65184 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 9 -1 0 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +0000 +0400 +0400 +ENDCHAR +STARTCHAR FEA1 +ENCODING 65185 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 12 0 -4 +BITMAP +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FEA2 +ENCODING 65186 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 12 0 -4 +BITMAP +3F80 +7F80 +0E00 +31C0 +41C0 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FEA3 +ENCODING 65187 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 6 -1 3 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR FEA4 +ENCODING 65188 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 6 -1 3 +BITMAP +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR FEA5 +ENCODING 65189 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 9 16 0 -4 +BITMAP +0C00 +0400 +0000 +0000 +3F80 +7F80 +0C00 +3000 +4000 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FEA6 +ENCODING 65190 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 16 0 -4 +BITMAP +0400 +0400 +0000 +0000 +3F80 +7F80 +0E00 +31C0 +41C0 +8000 +8000 +8000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FEA7 +ENCODING 65191 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 3 +BITMAP +0400 +0400 +0000 +0000 +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR FEA8 +ENCODING 65192 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 3 +BITMAP +0400 +0400 +0000 +0000 +1C00 +1F00 +0780 +01C0 +FFE0 +FFE0 +ENDCHAR +STARTCHAR FEA9 +ENCODING 65193 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 8 1 3 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEAA +ENCODING 65194 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 8 1 3 +BITMAP +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEAB +ENCODING 65195 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +40 +60 +00 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEAC +ENCODING 65196 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 5 12 1 3 +BITMAP +40 +60 +00 +00 +20 +30 +18 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEAD +ENCODING 65197 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 1 -2 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FEAE +ENCODING 65198 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 10 1 -2 +BITMAP +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FEAF +ENCODING 65199 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -2 +BITMAP +04 +04 +00 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FEB0 +ENCODING 65200 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 14 1 -2 +BITMAP +04 +04 +00 +00 +02 +03 +01 +01 +01 +01 +01 +03 +8E +78 +ENDCHAR +STARTCHAR FEB1 +ENCODING 65201 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 9 1 -1 +BITMAP +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR FEB2 +ENCODING 65202 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 9 1 -1 +BITMAP +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR FEB3 +ENCODING 65203 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 5 -1 3 +BITMAP +0020 +10A0 +08A0 +FFE0 +FF60 +ENDCHAR +STARTCHAR FEB4 +ENCODING 65204 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 5 -1 3 +BITMAP +0020 +10A0 +08A0 +FFE0 +FF60 +ENDCHAR +STARTCHAR FEB5 +ENCODING 65205 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 -1 +BITMAP +0030 +0038 +0028 +0020 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR FEB6 +ENCODING 65206 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 15 14 1 -1 +BITMAP +0030 +0038 +0028 +0020 +0000 +0104 +0182 +0092 +80FE +80FE +8080 +8180 +FF00 +7C00 +ENDCHAR +STARTCHAR FEB7 +ENCODING 65207 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 3 +BITMAP +0100 +01C0 +0340 +0300 +0000 +0020 +10A0 +08A0 +FFE0 +FF60 +ENDCHAR +STARTCHAR FEB8 +ENCODING 65208 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 11 10 -1 3 +BITMAP +0100 +01C0 +0340 +0300 +0000 +0020 +10A0 +08A0 +FFE0 +FF60 +ENDCHAR +STARTCHAR FEB9 +ENCODING 65209 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 9 1 -1 +BITMAP +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR FEBA +ENCODING 65210 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 9 1 -1 +BITMAP +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR FEBB +ENCODING 65211 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 6 -1 3 +BITMAP +000700 +001F80 +103180 +08C180 +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR FEBC +ENCODING 65212 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 6 -1 3 +BITMAP +000700 +001F80 +103180 +08C180 +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR FEBD +ENCODING 65213 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 12 1 -1 +BITMAP +000800 +000800 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR FEBE +ENCODING 65214 +SWIDTH 1080 0 +DWIDTH 21 0 +BBX 20 12 1 -1 +BITMAP +000800 +000800 +000000 +0101E0 +0187F0 +008C30 +80FFF0 +80FFF0 +808000 +810000 +FF0000 +7C0000 +ENDCHAR +STARTCHAR FEBF +ENCODING 65215 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 9 -1 3 +BITMAP +006000 +006000 +000000 +000700 +001F80 +103180 +08C180 +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR FEC0 +ENCODING 65216 +SWIDTH 822 0 +DWIDTH 16 0 +BBX 17 9 -1 3 +BITMAP +006000 +006000 +000000 +000700 +001F80 +103180 +08C180 +FFFF80 +FFFF80 +ENDCHAR +STARTCHAR FEC1 +ENCODING 65217 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC2 +ENCODING 65218 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC3 +ENCODING 65219 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC4 +ENCODING 65220 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1800 +0800 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC5 +ENCODING 65221 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC6 +ENCODING 65222 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC7 +ENCODING 65223 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC8 +ENCODING 65224 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 12 11 -1 4 +BITMAP +1800 +1880 +0880 +0800 +0800 +08E0 +0BF0 +0630 +0830 +FFF0 +FFF0 +ENDCHAR +STARTCHAR FEC9 +ENCODING 65225 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 16 0 -4 +BITMAP +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR FECA +ENCODING 65226 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 9 13 0 -4 +BITMAP +1C00 +3C00 +1C00 +3C00 +2780 +4380 +4000 +8000 +4000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FECB +ENCODING 65227 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 6 -1 3 +BITMAP +1E00 +3F00 +2040 +3380 +FF00 +FC00 +ENDCHAR +STARTCHAR FECC +ENCODING 65228 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 6 -1 3 +BITMAP +1E +3E +3E +0C +FF +E3 +ENDCHAR +STARTCHAR FECD +ENCODING 65229 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 20 0 -4 +BITMAP +1000 +1000 +0000 +0000 +3800 +7C00 +6000 +8000 +8100 +6700 +7C00 +3000 +2000 +4000 +8000 +8000 +C000 +6000 +7F80 +1F00 +ENDCHAR +STARTCHAR FECE +ENCODING 65230 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 9 17 0 -4 +BITMAP +0800 +0800 +0000 +0000 +1C00 +3C00 +1C00 +3C00 +2780 +4380 +4000 +8000 +4000 +4000 +7000 +3F80 +1F00 +ENDCHAR +STARTCHAR FECF +ENCODING 65231 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 9 -1 3 +BITMAP +0C00 +0C00 +0000 +1E00 +3F00 +2040 +3380 +FF00 +FC00 +ENDCHAR +STARTCHAR FED0 +ENCODING 65232 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 10 -1 3 +BITMAP +08 +08 +00 +00 +1E +3E +3E +0C +FF +E3 +ENDCHAR +STARTCHAR FED1 +ENCODING 65233 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 10 0 3 +BITMAP +0018 +0018 +0000 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FED2 +ENCODING 65234 +SWIDTH 771 0 +DWIDTH 15 0 +BBX 15 10 0 3 +BITMAP +0018 +0018 +0000 +0000 +400C +800E +801A +C00E +7FFE +3FFE +ENDCHAR +STARTCHAR FED3 +ENCODING 65235 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 11 -1 3 +BITMAP +10 +10 +00 +18 +38 +2C +3C +3C +04 +FC +FC +ENDCHAR +STARTCHAR FED4 +ENCODING 65236 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 3 +BITMAP +08 +08 +00 +00 +18 +1C +24 +24 +1C +0C +FC +FC +ENDCHAR +STARTCHAR FED5 +ENCODING 65237 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -1 +BITMAP +0100 +0580 +0400 +0000 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR FED6 +ENCODING 65238 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 14 1 -1 +BITMAP +0100 +0580 +0400 +0000 +0000 +0180 +03C0 +02C0 +83C0 +83C0 +8040 +80C0 +FF80 +7F00 +ENDCHAR +STARTCHAR FED7 +ENCODING 65239 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 12 -1 3 +BITMAP +08 +28 +20 +00 +18 +38 +2C +3C +3C +04 +FC +FC +ENDCHAR +STARTCHAR FED8 +ENCODING 65240 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 13 -1 3 +BITMAP +08 +28 +20 +00 +00 +18 +1C +24 +24 +1C +0C +FC +FC +ENDCHAR +STARTCHAR FED9 +ENCODING 65241 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 12 0 3 +BITMAP +0040 +0060 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR FEDA +ENCODING 65242 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 12 0 3 +BITMAP +0040 +0060 +0060 +0240 +0420 +0720 +0120 +0120 +9E20 +C020 +7FE0 +7FE0 +ENDCHAR +STARTCHAR FEDB +ENCODING 65243 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 11 -1 3 +BITMAP +03 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FEDC +ENCODING 65244 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 11 -1 3 +BITMAP +03 +0F +3C +20 +30 +38 +0C +02 +01 +FF +FF +ENDCHAR +STARTCHAR FEDD +ENCODING 65245 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 0 +BITMAP +0200 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR FEDE +ENCODING 65246 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 0 +BITMAP +0200 +0300 +0100 +0100 +0100 +0100 +0100 +0100 +8100 +8080 +8080 +8080 +8300 +FF00 +7E00 +ENDCHAR +STARTCHAR FEDF +ENCODING 65247 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 12 -1 3 +BITMAP +20 +38 +10 +10 +10 +10 +10 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEE0 +ENCODING 65248 +SWIDTH 205 0 +DWIDTH 4 0 +BBX 5 12 -1 3 +BITMAP +20 +38 +10 +10 +10 +10 +10 +08 +08 +08 +F8 +F8 +ENDCHAR +STARTCHAR FEE1 +ENCODING 65249 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 11 0 -4 +BITMAP +38 +3C +0C +3C +7C +C0 +80 +80 +40 +40 +40 +ENDCHAR +STARTCHAR FEE2 +ENCODING 65250 +SWIDTH 308 0 +DWIDTH 6 0 +BBX 6 11 0 -4 +BITMAP +38 +3C +0C +3C +7C +C0 +80 +80 +40 +40 +40 +ENDCHAR +STARTCHAR FEE3 +ENCODING 65251 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 5 -1 3 +BITMAP +02 +0D +1D +FF +F7 +ENDCHAR +STARTCHAR FEE4 +ENCODING 65252 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 5 -1 3 +BITMAP +02 +0D +1D +FF +F7 +ENDCHAR +STARTCHAR FEE5 +ENCODING 65253 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 -1 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FEE6 +ENCODING 65254 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 12 1 -1 +BITMAP +0800 +0800 +0000 +0000 +0080 +0080 +8080 +8080 +8080 +8180 +FF00 +7E00 +ENDCHAR +STARTCHAR FEE7 +ENCODING 65255 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 9 -1 3 +BITMAP +10 +10 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FEE8 +ENCODING 65256 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 9 -1 3 +BITMAP +10 +10 +00 +08 +08 +0C +04 +FC +FC +ENDCHAR +STARTCHAR FEE9 +ENCODING 65257 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 4 7 1 3 +BITMAP +40 +E0 +F0 +90 +90 +F0 +E0 +ENDCHAR +STARTCHAR FEEA +ENCODING 65258 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 7 9 0 4 +BITMAP +10 +10 +28 +48 +F8 +E8 +08 +06 +06 +ENDCHAR +STARTCHAR FEEB +ENCODING 65259 +SWIDTH 462 0 +DWIDTH 9 0 +BBX 8 8 -1 3 +BITMAP +08 +1C +1C +26 +27 +19 +FF +E7 +ENDCHAR +STARTCHAR FEEC +ENCODING 65260 +SWIDTH 360 0 +DWIDTH 7 0 +BBX 8 10 -1 -1 +BITMAP +04 +0C +14 +18 +FF +FF +24 +34 +1E +0C +ENDCHAR +STARTCHAR FEED +ENCODING 65261 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FEEE +ENCODING 65262 +SWIDTH 411 0 +DWIDTH 8 0 +BBX 8 11 0 -2 +BITMAP +03 +07 +05 +05 +07 +03 +01 +01 +02 +86 +7C +ENDCHAR +STARTCHAR FEEF +ENCODING 65263 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 10 0 -1 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +ENDCHAR +STARTCHAR FEF0 +ENCODING 65264 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 7 0 -2 +BITMAP +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +ENDCHAR +STARTCHAR FEF1 +ENCODING 65265 +SWIDTH 617 0 +DWIDTH 12 0 +BBX 12 13 0 -4 +BITMAP +0060 +00F0 +0100 +0200 +43E0 +81E0 +8020 +C1C0 +7F80 +3E00 +0300 +0B00 +0800 +ENDCHAR +STARTCHAR FEF2 +ENCODING 65266 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 11 9 0 -4 +BITMAP +01E0 +43E0 +8200 +83C0 +C040 +7FC0 +3F00 +0A00 +0A00 +ENDCHAR +STARTCHAR FEF3 +ENCODING 65267 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 -1 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +20 +ENDCHAR +STARTCHAR FEF4 +ENCODING 65268 +SWIDTH 257 0 +DWIDTH 5 0 +BBX 6 10 -1 -1 +BITMAP +08 +08 +0C +04 +FC +FC +00 +08 +28 +20 +ENDCHAR +STARTCHAR FEF5 +ENCODING 65269 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 15 1 1 +BITMAP +E000 +0000 +8200 +C380 +E100 +6100 +1100 +0A00 +0A00 +0600 +0400 +0600 +1A00 +1E00 +1C00 +ENDCHAR +STARTCHAR FEF6 +ENCODING 65270 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 13 1 3 +BITMAP +E000 +0000 +C000 +F100 +7900 +0500 +0280 +0080 +0180 +0280 +0680 +3CC0 +F840 +ENDCHAR +STARTCHAR FEF7 +ENCODING 65271 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 10 15 0 1 +BITMAP +6000 +8000 +6100 +81C0 +0080 +4080 +6080 +3080 +0900 +0500 +0300 +0200 +0500 +0F00 +0E00 +ENDCHAR +STARTCHAR FEF8 +ENCODING 65272 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 13 1 3 +BITMAP +4000 +8000 +C000 +8100 +E100 +7900 +0480 +0280 +0180 +0280 +0680 +3CC0 +F840 +ENDCHAR +STARTCHAR FEF9 +ENCODING 65273 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 18 1 -4 +BITMAP +8200 +C380 +E100 +6100 +1100 +0A00 +0A00 +0600 +0400 +0600 +1A00 +1E00 +1C00 +0000 +1000 +2000 +1800 +2000 +ENDCHAR +STARTCHAR FEFA +ENCODING 65274 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 16 1 -2 +BITMAP +C000 +F100 +7900 +0500 +0280 +0080 +0180 +0280 +0680 +3CC0 +F840 +0000 +2000 +4000 +6000 +4000 +ENDCHAR +STARTCHAR FEFB +ENCODING 65275 +SWIDTH 514 0 +DWIDTH 10 0 +BBX 9 13 1 1 +BITMAP +8200 +C380 +E100 +6100 +1100 +0A00 +0A00 +0600 +0400 +0600 +1A00 +1E00 +1C00 +ENDCHAR +STARTCHAR FEFC +ENCODING 65276 +SWIDTH 565 0 +DWIDTH 11 0 +BBX 10 11 1 3 +BITMAP +C000 +F100 +7900 +0500 +0280 +0080 +0180 +0280 +0680 +3CC0 +F840 +ENDCHAR +STARTCHAR FFFC +ENCODING 65532 +SWIDTH 977 0 +DWIDTH 19 0 +BBX 19 14 0 0 +BITMAP +E71CE0 +800020 +800020 +000000 +1EF980 +B3C9A0 +A1F1A0 +A1C9A0 +B3C920 +1EFF00 +000000 +800020 +800020 +E71CE0 +ENDCHAR +ENDFONT diff --git a/Toddler_Timer/code.py b/Toddler_Timer/code.py new file mode 100755 index 000000000..5236402e9 --- /dev/null +++ b/Toddler_Timer/code.py @@ -0,0 +1,129 @@ +# SPDX-FileCopyrightText: 2025 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import board +import displayio +import neopixel +import digitalio +from adafruit_seesaw import seesaw, rotaryio, digitalio +from adafruit_bitmap_font import bitmap_font +from adafruit_display_text import label +import adafruit_displayio_ssd1306 +import simpleio +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff +from rainbowio import colorwheel + +COLOR = (255, 150, 0) # yellow +OFF = (0, 0, 0) +PIXEL_PIN = board.A0 +NUM_PIXELS = 6 +timers = [6, 10, 15, 20, 25, 30] # minutes +color_time = 20 # milliseconds + +# rotary encoder +i2c = board.STEMMA_I2C() +seesaw = seesaw.Seesaw(i2c, addr=0x36) +encoder = rotaryio.IncrementalEncoder(seesaw) +pos = -encoder.position +last_pos = pos +seesaw.pin_mode(24, seesaw.INPUT_PULLUP) +button = digitalio.DigitalIO(seesaw, 24) +button_state = False + +pixels = neopixel.NeoPixel(PIXEL_PIN, NUM_PIXELS, brightness=0.2, auto_write=False) +pixels.fill(OFF) +pixels.show() + +# display setup +displayio.release_displays() + +# oled +oled_reset = board.D9 +display_bus = displayio.I2CDisplay(i2c, device_address=0x3D, reset=oled_reset) +WIDTH = 128 +HEIGHT = 64 +display = adafruit_displayio_ssd1306.SSD1306(display_bus, width=WIDTH, height=HEIGHT) + +font = bitmap_font.load_font("/Arial-14.bdf") +main_area = label.Label(font, text="6 Minutes", color=0xFFFFFF) +main_area.anchor_point = (0.5, 0.0) +main_area.anchored_position = (display.width / 2, display.height / 2) +splash = displayio.Group() +splash.append(main_area) +display.root_group = splash + +timer_index = 0 +timer = timers[timer_index] +time_remaining = timer * 60000 +active_timer = False +timer_clock = ticks_ms() +color_clock = ticks_ms() +color_value = 0 +last_map = 0 +mapped_time = 0 + +while True: + if not active_timer: + pos = encoder.position + if pos != last_pos: + if pos > last_pos: + timer_index = (timer_index + 1) % 6 + else: + timer_index = (timer_index - 1) % 6 + print(timer_index) + main_area.text = f"{timers[timer_index]} Minutes" + last_pos = pos + if not button.value and not button_state: + main_area.text = "START!" + timer = timers[timer_index] + time_remaining = timer * 60000 + last_map = 0 + timer_clock = ticks_ms() + color_clock = ticks_ms() + active_timer = True + button_state = True + if button.value and button_state: + button_state = False + if active_timer: + if ticks_diff(ticks_ms(), timer_clock) >= 1000: + time_remaining -= 1000 + remaining = int(time_remaining / 1000) + secs_remaining = remaining % 60 + remaining //= 60 + mins_remaining = remaining % 60 + if time_remaining > 0: + mapped_time = simpleio.map_range( + time_remaining, 0, (timer * 60000), 0, NUM_PIXELS + 1 + ) + mapped_time = max(mapped_time, 1) + if int(mapped_time) != last_map: + pixels.fill(OFF) + last_map = int(mapped_time) + main_area.text = f"{mins_remaining}:{secs_remaining:02}" + else: + pixels.fill(COLOR) + pixels.show() + time.sleep(0.5) + pixels.fill(OFF) + pixels.show() + main_area.text = "DONE!" + print(time_remaining) + timer_clock = ticks_add(timer_clock, 1000) + if ticks_diff(ticks_ms(), color_clock) >= color_time: + color_value = (color_value + 1) % 255 + for i in range(int(mapped_time)): + pixels[i] = colorwheel(color_value) + if time_remaining > 0: + pixels.show() + color_clock = ticks_add(color_clock, color_time) + if not button.value and not button_state: + timer = timers[timer_index] + pixels.fill(OFF) + pixels.show() + main_area.text = "STOPPED" + active_timer = False + button_state = True + if button.value and button_state: + button_state = False diff --git a/Trinkey_QT2040_Enviro_Gadget/arduino/trinkey_qt2040_enviro/trinkey_qt2040_enviro.ino b/Trinkey_QT2040_Enviro_Gadget/arduino/trinkey_qt2040_enviro/trinkey_qt2040_enviro.ino index 4ea2ab447..2c7189c3f 100755 --- a/Trinkey_QT2040_Enviro_Gadget/arduino/trinkey_qt2040_enviro/trinkey_qt2040_enviro.ino +++ b/Trinkey_QT2040_Enviro_Gadget/arduino/trinkey_qt2040_enviro/trinkey_qt2040_enviro.ino @@ -4,7 +4,7 @@ #include #include -#include +#include #include //--| User Config |----------------------------------------------- @@ -15,7 +15,7 @@ //---------------------------------------------------------------- Adafruit_BME280 bme; -SensirionI2CScd4x scd4x; +SensirionI2cScd4x scd4x; Adafruit_NeoPixel neopixel(1, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800); uint16_t CO2, data_ready; @@ -36,9 +36,9 @@ void setup() { Serial.println("Failed to initialize BME280."); neoPanic(); } - + Wire.begin(); // init SCD40 - scd4x.begin(Wire); + scd4x.begin(Wire, SCD41_I2C_ADDR_62); scd4x.stopPeriodicMeasurement(); if (scd4x.startPeriodicMeasurement()) { Serial.println("Failed to start SCD40."); diff --git a/Tripler_PiCowbell_Demos/Arduino_PiCowbell_Tripler_Demo/.feather_rp2040.test.only b/Tripler_PiCowbell_Demos/Arduino_PiCowbell_Tripler_Demo/.feather_rp2040.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/Tripler_PiCowbell_Demos/Arduino_PiCowbell_Tripler_Demo/Arduino_PiCowbell_Tripler_Demo.ino b/Tripler_PiCowbell_Demos/Arduino_PiCowbell_Tripler_Demo/Arduino_PiCowbell_Tripler_Demo.ino new file mode 100644 index 000000000..5dace8e43 --- /dev/null +++ b/Tripler_PiCowbell_Demos/Arduino_PiCowbell_Tripler_Demo/Arduino_PiCowbell_Tripler_Demo.ino @@ -0,0 +1,71 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +#include +#include // Core graphics library +#include // Hardware-specific library for ST7789 +#include +#include + +#define LED LED_BUILTIN +#define TFT_CS 21 +#define TFT_RST -1 +#define TFT_DC 20 +#define NEO_PIN A2 + +uint32_t Wheel(byte WheelPos); + +Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); + +Adafruit_NeoPixel pixel = Adafruit_NeoPixel(1, NEO_PIN, NEO_GRB + NEO_KHZ800); + +unsigned long lastMillis = 0; +uint8_t j = 0; + +void setup() { + Serial.begin(115200); + //while (!Serial) delay(1); // wait for serial port + tft.init(240, 240); + pinMode(LED, OUTPUT); + delay (100); + Serial.println("PiCowbell Tripler Demo"); + tft.setFont(&FreeSansBold24pt7b); + pixel.begin(); + pixel.setBrightness(50); + pixel.show(); // Initialize all pixels to 'off' + lastMillis = millis(); + +} + +void loop() { + if (millis() > (lastMillis + 5000)) { + digitalWrite(LED, HIGH); + // get the on-board voltage + float vsys = analogRead(A3) * 3 * 3.3 / 1023.0; + Serial.printf("Vsys: %0.1f V", vsys); + Serial.println(); + digitalWrite(LED, LOW); + tft.fillScreen(ST77XX_BLACK); + tft.setCursor(240 / 4, 240 / 2); + tft.setTextColor(ST77XX_WHITE); + tft.printf("%0.1f V", vsys); + lastMillis = millis(); + } + pixel.setPixelColor(0, Wheel(j++)); + pixel.show(); + delay(20); +} + +uint32_t Wheel(byte WheelPos) { + WheelPos = 255 - WheelPos; + if(WheelPos < 85) { + return pixel.Color(255 - WheelPos * 3, 0, WheelPos * 3); + } + if(WheelPos < 170) { + WheelPos -= 85; + return pixel.Color(0, WheelPos * 3, 255 - WheelPos * 3); + } + WheelPos -= 170; + return pixel.Color(WheelPos * 3, 255 - WheelPos * 3, 0); +} diff --git a/Tripler_PiCowbell_Demos/CircuitPython/code.py b/Tripler_PiCowbell_Demos/CircuitPython/code.py new file mode 100644 index 000000000..989d17894 --- /dev/null +++ b/Tripler_PiCowbell_Demos/CircuitPython/code.py @@ -0,0 +1,54 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import busio +import board +from analogio import AnalogIn +import adafruit_st7789 +import displayio +import neopixel +from rainbowio import colorwheel +from adafruit_display_text import label +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff +from font_orbitron_bold_webfont_36 import FONT as orbitron_font + +displayio.release_displays() +spi = busio.SPI(clock=board.GP18, MOSI=board.GP19) +display_bus = displayio.FourWire(spi, command=board.GP20, chip_select=board.GP21, reset=None) +display = adafruit_st7789.ST7789(display_bus, width=240, height=240, rowstart=80, rotation=0) + +group = displayio.Group() +text = label.Label(orbitron_font, text="0V", color=0xFF0000) +text.anchor_point = (0.5, 0.5) +text.anchored_position = (display.width / 2, display.height / 2) +group.append(text) +display.root_group = group + +analog_in = AnalogIn(board.A3) + +def get_vsys(pin): + return ((pin.value * 3) * 3.3) / 65535 + +pixel_pin = board.A2 +num_pixels = 1 +pixel = neopixel.NeoPixel(pixel_pin, num_pixels, + brightness=0.1, auto_write=True) +hue = 0 +pixel.fill(colorwheel(hue)) + +bat_clock = ticks_ms() +bat_timer = 5000 +neo_clock = ticks_ms() +neo_timer = 100 + +while True: + if ticks_diff(ticks_ms(), bat_clock) >= bat_timer: + print(f"The battery level is: {get_vsys(analog_in):.1f}V") + text.text = f"{get_vsys(analog_in):.1f}V" + text.color = colorwheel(hue) + bat_clock = ticks_add(bat_clock, bat_timer) + if ticks_diff(ticks_ms(), neo_clock) >= neo_timer: + hue = (hue + 7) % 256 + pixel.fill(colorwheel(hue)) + neo_clock = ticks_add(neo_clock, neo_timer) diff --git a/Tripler_PiCowbell_Demos/CircuitPython/font_orbitron_bold_webfont_36/__init__.mpy b/Tripler_PiCowbell_Demos/CircuitPython/font_orbitron_bold_webfont_36/__init__.mpy new file mode 100644 index 000000000..4c3f7feb3 Binary files /dev/null and b/Tripler_PiCowbell_Demos/CircuitPython/font_orbitron_bold_webfont_36/__init__.mpy differ diff --git a/Tripler_PiCowbell_Demos/CircuitPython/font_orbitron_bold_webfont_36/font.pcf b/Tripler_PiCowbell_Demos/CircuitPython/font_orbitron_bold_webfont_36/font.pcf new file mode 100644 index 000000000..065e59afa Binary files /dev/null and b/Tripler_PiCowbell_Demos/CircuitPython/font_orbitron_bold_webfont_36/font.pcf differ diff --git a/Tripler_PiCowbell_Demos/CircuitPython/font_orbitron_bold_webfont_36/font.pcf.license b/Tripler_PiCowbell_Demos/CircuitPython/font_orbitron_bold_webfont_36/font.pcf.license new file mode 100644 index 000000000..eee00dba7 --- /dev/null +++ b/Tripler_PiCowbell_Demos/CircuitPython/font_orbitron_bold_webfont_36/font.pcf.license @@ -0,0 +1,3 @@ +SPDX-FileCopyrightText: 2009-2023 Micah Rich, The League of Moveable Type, and individuals as credited + +SPDX-License-Identifier: OFL-1.1 diff --git a/USB_C_Power_Deliverer/code.py b/USB_C_Power_Deliverer/code.py new file mode 100644 index 000000000..3c8daa1b1 --- /dev/null +++ b/USB_C_Power_Deliverer/code.py @@ -0,0 +1,156 @@ +# SPDX-FileCopyrightText: Copyright (c) 2024 John Park for Adafruit Industries +# +# SPDX-License-Identifier: MIT +""" +USB C PD power supply w HUSB238 +pick voltages and then set them, measures high side current with INA219 +""" +import time +import board +import keypad +import displayio +import terminalio +from adafruit_display_text import label +from adafruit_display_shapes.rect import Rect +import adafruit_husb238 +from adafruit_ina219 import INA219 + +i2c = board.I2C() + +tft_d0_button = keypad.Keys((board.D0,), value_when_pressed=False, pull=True) +tft_buttons = keypad.Keys((board.D1, board.D2), value_when_pressed=True, pull=True) + +# Initialize INA219 current sensor +ina219 = INA219(i2c) + +TXTCOL_VOLT = 0x8f00cd +TXTCOL_CURR = 0xb30090 +TXTCOL_DIM = 0xCD8F00 +TXTCOL_HEAD = 0xCD8F00 +TXTCOL_BTN = 0xa0a0a0 +BGCOL = 0x220030 +display = board.DISPLAY +group = displayio.Group() + +background_rect = Rect(0, 0, display.width, display.height, fill=BGCOL) +group.append(background_rect) + +warning_text = "plug in USB C PD cable, press reset" + +FONT = terminalio.FONT + +display.root_group = group + +RUNNING = None +PLUGGED = None + +# Initialize HUSB238 PD dummy +try: + pd = adafruit_husb238.Adafruit_HUSB238(i2c) + RUNNING = True + PLUGGED = True +except ValueError: + print("plug in a USB C PD cable, then press reset") + RUNNING = False + PLUGGED = False + + warning_label = label.Label( + FONT, text=warning_text, color=0xdd0000, + scale=1, anchor_point=(0,0), + anchored_position=(20, 10) + ) + group.append(warning_label) + #stop the code here + +while not RUNNING: + pass + +while RUNNING: + voltages = pd.available_voltages + print("The following voltages are available:") + for i, volts in enumerate(voltages): + print(f"{volts}V") + + v = 0 + + if pd.attached: + pd.voltage = voltages[0] + print(f"Voltage is set to {pd.voltage}V/{pd.current}A") + + display = board.DISPLAY + + group = displayio.Group() + background_rect = Rect(0, 0, display.width, display.height, fill=BGCOL) + group.append(background_rect) + vert_bar = Rect(40, 0, 3, display.height, fill=0x000000) + group.append(vert_bar) + + FONT = terminalio.FONT + + header_label = label.Label( + FONT, text="Power Deliverer", color=TXTCOL_HEAD, + scale=2, x=50, y=8 + ) + group.append(header_label) + voltage_label = label.Label( + FONT, text=str(voltages[0])+"V", color=TXTCOL_VOLT, + scale=5, anchor_point=(0,0), + anchored_position=(50, 20) + ) + group.append(voltage_label) + current_label = label.Label( + FONT, text="0mA", color=TXTCOL_CURR, + scale=5, anchor_point=(0,0), + anchored_position=(50, 80) + ) + group.append(current_label) + go_label = label.Label(FONT, text="set", color=TXTCOL_BTN, scale=2, x=1, y=6) + group.append(go_label) + up_label = label.Label(FONT, text="+v", color=TXTCOL_BTN, scale=2, x=1, y=display.height//2-2) + group.append(up_label) + down_label = label.Label(FONT, text="-v", color=TXTCOL_BTN, scale=2, x=1, y=display.height-12) + group.append(down_label) + + display.root_group = group + + + while True: + tft_d0_button_event = tft_d0_button.events.get() + if tft_d0_button_event and tft_d0_button_event.pressed: + try: + print(f"Setting to {voltages[v]}V!") + pd.voltage = voltages[v] + voltage_label.text=str(voltages[v]) + "V" + voltage_label.color=TXTCOL_VOLT + print(f"It is set to {pd.voltage}V/{pd.current}A") + print() + PLUGGED=True + except OSError: + print(warning_text) + voltage_label.text="replug" + current_label.text="USB C" + PLUGGED=False + + if PLUGGED: + tft_buttons_event = tft_buttons.events.get() + if tft_buttons_event and tft_buttons_event.pressed: + if tft_buttons_event.key_number == 0: + v = (v + 1) % len(voltages) # maybe have this stop at max + voltage_label.color=TXTCOL_DIM + voltage_label.text="["+str(voltages[v]) + "V]" + print(f"Voltage will be set to {voltages[v]}V") + + if tft_buttons_event.key_number == 1: + v = (v - 1) % len(voltages) # maybe have this stop at min + voltage_label.color=TXTCOL_DIM + voltage_label.text="["+str(voltages[v]) + "V]" + print(f"Voltage will be set to {voltages[v]}V") + + current = ina219.current # current in mA + # power = ina219.power # power in watts + current_label.text= str(abs(int(current))) + "mA" + + if ina219.overflow: + print("Internal Math Overflow Detected!") + print("") + time.sleep(0.2) diff --git a/USB_Host_BFF_Examples/Arduino_USB_Host_BFF_DeviceInfo/.esp32.test.only b/USB_Host_BFF_Examples/Arduino_USB_Host_BFF_DeviceInfo/.esp32.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/USB_Host_BFF_Examples/Arduino_USB_Host_BFF_DeviceInfo/Arduino_USB_Host_BFF_DeviceInfo.ino b/USB_Host_BFF_Examples/Arduino_USB_Host_BFF_DeviceInfo/Arduino_USB_Host_BFF_DeviceInfo.ino new file mode 100644 index 000000000..f629f8873 --- /dev/null +++ b/USB_Host_BFF_Examples/Arduino_USB_Host_BFF_DeviceInfo/Arduino_USB_Host_BFF_DeviceInfo.ino @@ -0,0 +1,233 @@ +// SPDX-FileCopyrightText: 2024 Ha Thach for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/********************************************************************* + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + MIT license, check LICENSE for more information + Copyright (c) 2019 Ha Thach for Adafruit Industries + All text above, and the splash screen below must be included in + any redistribution +*********************************************************************/ + +/* This example demonstrates use of both device and host, where + * - Device run on native usb controller (roothub port0) + * - Host run on MAX3421E controller (roothub port1) tested with: + * - SAMD21, SAMD51, nRF52840, ESP32S2, ESP32S3, ESP32 + * - RP2040: "pio_usb.h" must not be included, otherwise pio-usb will be used as host controller + * + * Requirements: + * - SPI instance, CS pin, INT pin are correctly configured + */ + +/* Host example will get device descriptors of attached devices and print it out: + * Device 1: ID 046d:c52f + Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 0200 + bDeviceClass 0 + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 8 + idVendor 0x046d + idProduct 0xc52f + bcdDevice 2200 + iManufacturer 1 Logitech + iProduct 2 USB Receiver + iSerialNumber 0 + bNumConfigurations 1 + * + */ +#include "Adafruit_TinyUSB.h" +#include "SPI.h" + +Adafruit_USBH_Host USBHost(&SPI, A1, A2); + +// Language ID: English +#define LANGUAGE_ID 0x0409 + +typedef struct { + tusb_desc_device_t desc_device; + uint16_t manufacturer[32]; + uint16_t product[48]; + uint16_t serial[16]; + bool mounted; +} dev_info_t; + +// CFG_TUH_DEVICE_MAX is defined by tusb_config header +dev_info_t dev_info[CFG_TUH_DEVICE_MAX] = { 0 }; + +//--------------------------------------------------------------------+ +// setup() & loop() +//--------------------------------------------------------------------+ +void setup() { + Serial.begin(115200); + while ( !Serial ) delay(10); // wait for native usb + Serial.println("starting usb.."); + // init host stack on controller (rhport) 1 + USBHost.begin(1); + Serial.println("usb started"); + Serial.println("TinyUSB Dual: Device Info Example with MAX3421E"); +} + +void loop() { + USBHost.task(); + Serial.flush(); +} + +//--------------------------------------------------------------------+ +// TinyUSB Host callbacks +//--------------------------------------------------------------------+ +void print_device_descriptor(tuh_xfer_t *xfer); + +void utf16_to_utf8(uint16_t *temp_buf, size_t buf_len); + +void print_lsusb(void) { + bool no_device = true; + for (uint8_t daddr = 1; daddr < CFG_TUH_DEVICE_MAX + 1; daddr++) { + // TODO can use tuh_mounted(daddr), but tinyusb has an bug + // use local connected flag instead + dev_info_t *dev = &dev_info[daddr - 1]; + if (dev->mounted) { + Serial.printf("Device %u: ID %04x:%04x %s %s\r\n", daddr, + dev->desc_device.idVendor, dev->desc_device.idProduct, + (char *) dev->manufacturer, (char *) dev->product); + + no_device = false; + } + } + + if (no_device) { + Serial.println("No device connected (except hub)"); + } +} + +// Invoked when device is mounted (configured) +void tuh_mount_cb(uint8_t daddr) { + Serial.printf("Device attached, address = %d\r\n", daddr); + + dev_info_t *dev = &dev_info[daddr - 1]; + dev->mounted = true; + + // Get Device Descriptor + tuh_descriptor_get_device(daddr, &dev->desc_device, 18, print_device_descriptor, 0); +} + +/// Invoked when device is unmounted (bus reset/unplugged) +void tuh_umount_cb(uint8_t daddr) { + Serial.printf("Device removed, address = %d\r\n", daddr); + dev_info_t *dev = &dev_info[daddr - 1]; + dev->mounted = false; + + // print device summary + print_lsusb(); +} + +void print_device_descriptor(tuh_xfer_t *xfer) { + if (XFER_RESULT_SUCCESS != xfer->result) { + Serial.printf("Failed to get device descriptor\r\n"); + return; + } + + uint8_t const daddr = xfer->daddr; + dev_info_t *dev = &dev_info[daddr - 1]; + tusb_desc_device_t *desc = &dev->desc_device; + + Serial.printf("Device %u: ID %04x:%04x\r\n", daddr, desc->idVendor, desc->idProduct); + Serial.printf("Device Descriptor:\r\n"); + Serial.printf(" bLength %u\r\n" , desc->bLength); + Serial.printf(" bDescriptorType %u\r\n" , desc->bDescriptorType); + Serial.printf(" bcdUSB %04x\r\n" , desc->bcdUSB); + Serial.printf(" bDeviceClass %u\r\n" , desc->bDeviceClass); + Serial.printf(" bDeviceSubClass %u\r\n" , desc->bDeviceSubClass); + Serial.printf(" bDeviceProtocol %u\r\n" , desc->bDeviceProtocol); + Serial.printf(" bMaxPacketSize0 %u\r\n" , desc->bMaxPacketSize0); + Serial.printf(" idVendor 0x%04x\r\n" , desc->idVendor); + Serial.printf(" idProduct 0x%04x\r\n" , desc->idProduct); + Serial.printf(" bcdDevice %04x\r\n" , desc->bcdDevice); + + // Get String descriptor using Sync API + Serial.printf(" iManufacturer %u ", desc->iManufacturer); + if (XFER_RESULT_SUCCESS == + tuh_descriptor_get_manufacturer_string_sync(daddr, LANGUAGE_ID, dev->manufacturer, sizeof(dev->manufacturer))) { + utf16_to_utf8(dev->manufacturer, sizeof(dev->manufacturer)); + Serial.printf((char *) dev->manufacturer); + } + Serial.printf("\r\n"); + + Serial.printf(" iProduct %u ", desc->iProduct); + if (XFER_RESULT_SUCCESS == + tuh_descriptor_get_product_string_sync(daddr, LANGUAGE_ID, dev->product, sizeof(dev->product))) { + utf16_to_utf8(dev->product, sizeof(dev->product)); + Serial.printf((char *) dev->product); + } + Serial.printf("\r\n"); + + Serial.printf(" iSerialNumber %u ", desc->iSerialNumber); + if (XFER_RESULT_SUCCESS == + tuh_descriptor_get_serial_string_sync(daddr, LANGUAGE_ID, dev->serial, sizeof(dev->serial))) { + utf16_to_utf8(dev->serial, sizeof(dev->serial)); + Serial.printf((char *) dev->serial); + } + Serial.printf("\r\n"); + + Serial.printf(" bNumConfigurations %u\r\n", desc->bNumConfigurations); + + // print device summary + print_lsusb(); +} + +//--------------------------------------------------------------------+ +// String Descriptor Helper +//--------------------------------------------------------------------+ + +static void _convert_utf16le_to_utf8(const uint16_t *utf16, size_t utf16_len, uint8_t *utf8, size_t utf8_len) { + // TODO: Check for runover. + (void) utf8_len; + // Get the UTF-16 length out of the data itself. + + for (size_t i = 0; i < utf16_len; i++) { + uint16_t chr = utf16[i]; + if (chr < 0x80) { + *utf8++ = chr & 0xff; + } else if (chr < 0x800) { + *utf8++ = (uint8_t) (0xC0 | (chr >> 6 & 0x1F)); + *utf8++ = (uint8_t) (0x80 | (chr >> 0 & 0x3F)); + } else { + // TODO: Verify surrogate. + *utf8++ = (uint8_t) (0xE0 | (chr >> 12 & 0x0F)); + *utf8++ = (uint8_t) (0x80 | (chr >> 6 & 0x3F)); + *utf8++ = (uint8_t) (0x80 | (chr >> 0 & 0x3F)); + } + // TODO: Handle UTF-16 code points that take two entries. + } +} + +// Count how many bytes a utf-16-le encoded string will take in utf-8. +static int _count_utf8_bytes(const uint16_t *buf, size_t len) { + size_t total_bytes = 0; + for (size_t i = 0; i < len; i++) { + uint16_t chr = buf[i]; + if (chr < 0x80) { + total_bytes += 1; + } else if (chr < 0x800) { + total_bytes += 2; + } else { + total_bytes += 3; + } + // TODO: Handle UTF-16 code points that take two entries. + } + return total_bytes; +} + +void utf16_to_utf8(uint16_t *temp_buf, size_t buf_len) { + size_t utf16_len = ((temp_buf[0] & 0xff) - 2) / sizeof(uint16_t); + size_t utf8_len = _count_utf8_bytes(temp_buf + 1, utf16_len); + + _convert_utf16le_to_utf8(temp_buf + 1, utf16_len, (uint8_t *) temp_buf, buf_len); + ((uint8_t *) temp_buf)[utf8_len] = '\0'; +} diff --git a/USB_Host_BFF_Examples/Arduino_USB_Host_BFF_HIDReport/.esp32.test.only b/USB_Host_BFF_Examples/Arduino_USB_Host_BFF_HIDReport/.esp32.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/USB_Host_BFF_Examples/Arduino_USB_Host_BFF_HIDReport/Arduino_USB_Host_BFF_HIDReport.ino b/USB_Host_BFF_Examples/Arduino_USB_Host_BFF_HIDReport/Arduino_USB_Host_BFF_HIDReport.ino new file mode 100644 index 000000000..a18f9f3d2 --- /dev/null +++ b/USB_Host_BFF_Examples/Arduino_USB_Host_BFF_HIDReport/Arduino_USB_Host_BFF_HIDReport.ino @@ -0,0 +1,74 @@ +// SPDX-FileCopyrightText: 2024 Ha Thach for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/********************************************************************* + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + MIT license, check LICENSE for more information + Copyright (c) 2019 Ha Thach for Adafruit Industries + All text above, and the splash screen below must be included in + any redistribution +*********************************************************************/ + +#include "Adafruit_TinyUSB.h" +#include "SPI.h" + +Adafruit_USBH_Host USBHost(&SPI, A1, A2); + +void setup() { + Serial.begin(115200); + + // init host stack on controller (rhport) 1 + USBHost.begin(1); + +// while ( !Serial ) delay(10); // wait for native usb + Serial.println("TinyUSB Dual: HID Device Report Example"); +} + +void loop() { + USBHost.task(); + Serial.flush(); +} + +extern "C" { + +// Invoked when device with hid interface is mounted +// Report descriptor is also available for use. +// tuh_hid_parse_report_descriptor() can be used to parse common/simple enough +// descriptor. Note: if report descriptor length > CFG_TUH_ENUMERATION_BUFSIZE, +// it will be skipped therefore report_desc = NULL, desc_len = 0 +void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *desc_report, uint16_t desc_len) { + (void) desc_report; + (void) desc_len; + uint16_t vid, pid; + tuh_vid_pid_get(dev_addr, &vid, &pid); + + Serial.printf("HID device address = %d, instance = %d is mounted\r\n", dev_addr, instance); + Serial.printf("VID = %04x, PID = %04x\r\n", vid, pid); + if (!tuh_hid_receive_report(dev_addr, instance)) { + Serial.printf("Error: cannot request to receive report\r\n"); + } +} + +// Invoked when device with hid interface is un-mounted +void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) { + Serial.printf("HID device address = %d, instance = %d is unmounted\r\n", dev_addr, instance); +} + +// Invoked when received report from device via interrupt endpoint +void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *report, uint16_t len) { + Serial.printf("HIDreport : "); + for (uint16_t i = 0; i < len; i++) { + Serial.printf("0x%02X ", report[i]); + } + Serial.println(); + // continue to request to receive report + if (!tuh_hid_receive_report(dev_addr, instance)) { + Serial.printf("Error: cannot request to receive report\r\n"); + } +} + +} // extern C diff --git a/USB_Host_BFF_Examples/CircuitPython_DeviceInfo/code.py b/USB_Host_BFF_Examples/CircuitPython_DeviceInfo/code.py new file mode 100644 index 000000000..f8b984319 --- /dev/null +++ b/USB_Host_BFF_Examples/CircuitPython_DeviceInfo/code.py @@ -0,0 +1,23 @@ +# SPDX-FileCopyrightText: 2024 Scott Shawcroft for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +"""USB Host BFF Device Info CircuitPython Example""" + +import time +import board +import max3421e +import usb + +spi = board.SPI() +cs = board.A1 +irq = board.A2 + +host_chip = max3421e.Max3421E(spi, chip_select=cs, irq=irq) + +while True: + print("Finding devices:") + for device in usb.core.find(find_all=True): + # pylint: disable=line-too-long + print(f"{device.idVendor:04x}:{device.idProduct:04x}: {device.manufacturer} {device.product}") + time.sleep(5) diff --git a/USB_Host_BFF_Examples/CircuitPython_DeviceInfo_FeatherWing/code.py b/USB_Host_BFF_Examples/CircuitPython_DeviceInfo_FeatherWing/code.py new file mode 100644 index 000000000..2fa5fa657 --- /dev/null +++ b/USB_Host_BFF_Examples/CircuitPython_DeviceInfo_FeatherWing/code.py @@ -0,0 +1,24 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +"""USB Host FeatherWing Device Info CircuitPython Example""" + + +import time +import board +import max3421e +import usb + +spi = board.SPI() +cs = board.D10 +irq = board.D9 + +host_chip = max3421e.Max3421E(spi, chip_select=cs, irq=irq) + +while True: + print("Finding devices:") + for device in usb.core.find(find_all=True): + # pylint: disable=line-too-long + print(f"{device.idVendor:04x}:{device.idProduct:04x}: {device.manufacturer} {device.product}") + time.sleep(5) diff --git a/USB_Host_BFF_Examples/CircuitPython_HIDReport/code.py b/USB_Host_BFF_Examples/CircuitPython_HIDReport/code.py new file mode 100644 index 000000000..7f7011733 --- /dev/null +++ b/USB_Host_BFF_Examples/CircuitPython_HIDReport/code.py @@ -0,0 +1,49 @@ +# SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +"""USB Host BFF CircuitPython Example +Read key report from attached keyboard""" + + +import time +import array +import board +import max3421e +import usb + +spi = board.SPI() +cs = board.A1 +irq = board.A2 + +host_chip = max3421e.Max3421E(spi, chip_select=cs, irq=irq) + +device = None +vid = None +pid = None +while device is None: + for d in usb.core.find(find_all=True): + vid = d.idVendor + pid = d.idProduct + device = usb.core.find(idVendor=vid, idProduct=pid) + time.sleep(1) + +device.set_configuration() + +print(f"{device.idVendor:04x}:{device.idProduct:04x}: {device.manufacturer} {device.product}") + +# Test to see if the kernel is using the device and detach it. +if device.is_kernel_driver_active(0): + device.detach_kernel_driver(0) + +# Boot keyboards have 8 byte reports +buf = array.array("B", [0] * 8) +while True: + try: + count = device.read(0x81, buf) + # pylint: disable=broad-except + except Exception as e: + continue + for i in range(0, 8): + print(buf[i], end=" ") + print() diff --git a/USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad/.feather_rp2040_usbhost_tinyusb.test.only b/USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad/.feather_rp2040_usbhost_tinyusb.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad.ino b/USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad.ino new file mode 100644 index 000000000..750b7ed5e --- /dev/null +++ b/USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad.ino @@ -0,0 +1,278 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/********************************************************************* + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + MIT license, check LICENSE for more information + Copyright (c) 2019 Ha Thach for Adafruit Industries + All text above, and the splash screen below must be included in + any redistribution +*********************************************************************/ + +/* This example demonstrates use of both device and host, where + * - Device runs on native USB controller (roothub port0) + * - Host depends on MCU: + * - rp2040: bit-banging 2 GPIOs with Pico-PIO-USB library (roothub port1) + * + * Requirements: + * - For rp2040: + * - Pico-PIO-USB library + * - 2 consecutive GPIOs: D+ is defined by PIN_USB_HOST_DP, D- = D+ +1 + * - Provide VBus (5v) and GND for peripheral + * - CPU Speed must be either 120 or 240 MHz. Selected via "Menu -> CPU Speed" + */ + +// USBHost is defined in usbh_helper.h +#include "usbh_helper.h" +#include "tusb.h" +#include "Adafruit_TinyUSB.h" +#include "gamepad_reports.h" + +// HID report descriptor using TinyUSB's template +// Single Report (no ID) descriptor +uint8_t const desc_hid_report[] = { + TUD_HID_REPORT_DESC_GAMEPAD() +}; + +// USB HID object +Adafruit_USBD_HID usb_hid; + +// Report payload defined in src/class/hid/hid.h +// - For Gamepad Button Bit Mask see hid_gamepad_button_bm_t +// - For Gamepad Hat Bit Mask see hid_gamepad_hat_t +hid_gamepad_report_t gp; + +bool combo_active = false; + +void setup() { + if (!TinyUSBDevice.isInitialized()) { + TinyUSBDevice.begin(0); + } + Serial.begin(115200); + // Setup HID + usb_hid.setPollInterval(2); + usb_hid.setReportDescriptor(desc_hid_report, sizeof(desc_hid_report)); + usb_hid.begin(); + + // If already enumerated, additional class driverr begin() e.g msc, hid, midi won't take effect until re-enumeration + if (TinyUSBDevice.mounted()) { + TinyUSBDevice.detach(); + delay(10); + TinyUSBDevice.attach(); + } +} + +#if defined(ARDUINO_ARCH_RP2040) +//--------------------------------------------------------------------+ +// For RP2040 use both core0 for device stack, core1 for host stack +//--------------------------------------------------------------------// + +//------------- Core0 -------------// +void loop() { +} + +//------------- Core1 -------------// +void setup1() { + // configure pio-usb: defined in usbh_helper.h + rp2040_configure_pio_usb(); + + // run host stack on controller (rhport) 1 + // Note: For rp2040 pico-pio-usb, calling USBHost.begin() on core1 will have most of the + // host bit-banging processing works done in core1 to free up core0 for other works + USBHost.begin(1); +} + +void loop1() { + USBHost.task(); + Serial.flush(); + if (combo_active) { + turbo_button(); + } +} +#endif + +//--------------------------------------------------------------------+ +// HID Host Callback Functions +//--------------------------------------------------------------------+ + +void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len) +{ + Serial.printf("HID device mounted (address %d, instance %d)\n", dev_addr, instance); + + // Start receiving HID reports + if (!tuh_hid_receive_report(dev_addr, instance)) + { + Serial.printf("Error: cannot request to receive report\n"); + } +} + +void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) +{ + Serial.printf("HID device unmounted (address %d, instance %d)\n", dev_addr, instance); +} + +void turbo_button() { + if (combo_active) { + while (!usb_hid.ready()) { + yield(); + } + Serial.println("A"); + gp.buttons = GAMEPAD_BUTTON_A; + usb_hid.sendReport(0, &gp, sizeof(gp)); + Serial.println("off"); + delay(2); + gp.buttons = 0; + usb_hid.sendReport(0, &gp, sizeof(gp)); + delay(2); + } +} + +bool is_combo_detected(const uint8_t* combo, size_t combo_size, const uint8_t* report) { + for (size_t i = 0; i < combo_size; i++) { + uint8_t button = combo[i]; + + // Determine which byte the button is in and then check if it is pressed + if (button & BUTTON_A || button & BUTTON_B || button & BUTTON_X || button & BUTTON_Y) { + if ((report[BYTE_DPAD_BUTTONS] & button) != button) { + return false; // Button is not pressed + } + } else if (button & BUTTON_LEFT_PADDLE || button & BUTTON_RIGHT_PADDLE || + button & BUTTON_LEFT_TRIGGER || button & BUTTON_RIGHT_TRIGGER || + button & BUTTON_BACK || button & BUTTON_START) { + if ((report[BYTE_MISC_BUTTONS] & button) != button) { + return false; // Button is not pressed + } + } + } + return true; // All buttons in the combo are pressed +} + +void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len) { + + // Manage the combo state and print messages + if ((is_combo_detected(combo_report, combo_size, report)) && !combo_active) { + combo_active = true; + Serial.println("combo!"); + } else if ((is_combo_detected(combo_report, combo_size, report)) && combo_active) { + combo_active = false; + Serial.println("combo released!"); + } + // Handle analog stick inputs + gp.x = (report[BYTE_LEFT_STICK_X] != LEFT_STICK_X_NEUTRAL) ? map(report[BYTE_LEFT_STICK_X], 0, 255, -127, 127) : 0; + gp.y = (report[BYTE_LEFT_STICK_Y] != LEFT_STICK_Y_NEUTRAL) ? map(report[BYTE_LEFT_STICK_Y], 0, 255, -127, 127) : 0; + gp.z = (report[BYTE_RIGHT_STICK_X] != RIGHT_STICK_X_NEUTRAL) ? map(report[BYTE_RIGHT_STICK_X], 0, 255, -127, 127) : 0; + gp.rz = (report[BYTE_RIGHT_STICK_Y] != RIGHT_STICK_Y_NEUTRAL) ? map(report[BYTE_RIGHT_STICK_Y], 0, 255, -127, 127) : 0; + + // Debug print for report data + /*Serial.print("Report data: "); + for (int i = 0; i < len; i++) { + Serial.print(report[i], HEX); + Serial.print(" "); + } + Serial.println();*/ + + uint8_t dpad_value = report[BYTE_DPAD_BUTTONS] & DPAD_MASK; + + // Handle D-pad direction + if ((report[BYTE_DPAD_BUTTONS] & DPAD_NEUTRAL) == 0) { + switch (dpad_value) { + case DPAD_UP: gp.hat = 1; Serial.println("up"); break; + case DPAD_UP_RIGHT: gp.hat = 2; Serial.println("up/right"); break; + case DPAD_RIGHT: gp.hat = 3; Serial.println("right"); break; + case DPAD_DOWN_RIGHT: gp.hat = 4; Serial.println("down/right"); break; + case DPAD_DOWN: gp.hat = 5; Serial.println("down"); break; + case DPAD_DOWN_LEFT: gp.hat = 6; Serial.println("down/left"); break; + case DPAD_LEFT: gp.hat = 7; Serial.println("left"); break; + case DPAD_UP_LEFT: gp.hat = 8; Serial.println("up/left"); break; + } + } else { + gp.hat = 0; + } + uint16_t buttons = gp.buttons; + if ((report[BYTE_DPAD_BUTTONS] & BUTTON_X) == BUTTON_X) { + buttons |= GAMEPAD_BUTTON_X; + Serial.println("x"); + } else { + buttons &= ~GAMEPAD_BUTTON_X; + } + if ((report[BYTE_DPAD_BUTTONS] & BUTTON_A) == BUTTON_A) { + buttons |= GAMEPAD_BUTTON_A; + Serial.println("a"); + } else { + buttons &= ~GAMEPAD_BUTTON_A; + } + if ((report[BYTE_DPAD_BUTTONS] & BUTTON_B) == BUTTON_B) { + buttons |= GAMEPAD_BUTTON_B; + Serial.println("b"); + } else { + buttons &= ~GAMEPAD_BUTTON_B; + } + if ((report[BYTE_DPAD_BUTTONS] & BUTTON_Y) == BUTTON_Y) { + buttons |= GAMEPAD_BUTTON_Y; + Serial.println("y"); + } else { + buttons &= ~GAMEPAD_BUTTON_Y; + } + gp.buttons = buttons; + + if ((report[BYTE_MISC_BUTTONS] & BUTTON_LEFT_PADDLE) == BUTTON_LEFT_PADDLE) { + buttons |= GAMEPAD_BUTTON_TL; + Serial.println("left paddle"); + } else { + buttons &= ~GAMEPAD_BUTTON_TL; + } + if ((report[BYTE_MISC_BUTTONS] & BUTTON_RIGHT_PADDLE) == BUTTON_RIGHT_PADDLE) { + buttons |= GAMEPAD_BUTTON_TR; + Serial.println("right paddle"); + } else { + buttons &= ~GAMEPAD_BUTTON_TR; + } + if ((report[BYTE_MISC_BUTTONS] & BUTTON_LEFT_TRIGGER) == BUTTON_LEFT_TRIGGER) { + buttons |= GAMEPAD_BUTTON_TL2; + Serial.println("left trigger"); + } else { + buttons &= ~GAMEPAD_BUTTON_TL2; + } + if ((report[BYTE_MISC_BUTTONS] & BUTTON_RIGHT_TRIGGER) == BUTTON_RIGHT_TRIGGER) { + buttons |= GAMEPAD_BUTTON_TR2; + Serial.println("right trigger"); + } else { + buttons &= ~GAMEPAD_BUTTON_TR2; + } + if ((report[BYTE_MISC_BUTTONS] & BUTTON_BACK) == BUTTON_BACK) { + buttons |= GAMEPAD_BUTTON_SELECT; + Serial.println("back"); + } else { + buttons &= ~GAMEPAD_BUTTON_SELECT; + } + if ((report[BYTE_MISC_BUTTONS] & BUTTON_START) == BUTTON_START) { + buttons |= GAMEPAD_BUTTON_START; + Serial.println("start"); + } else { + buttons &= ~GAMEPAD_BUTTON_START; + } + // Set the final buttons state + gp.buttons = buttons; + + // Debug print for gp contents + /*Serial.print("gp.x: "); Serial.println(gp.x); + Serial.print("gp.y: "); Serial.println(gp.y); + Serial.print("gp.z: "); Serial.println(gp.z); + Serial.print("gp.rz: "); Serial.println(gp.rz); + Serial.print("gp.hat: "); Serial.println(gp.hat); + Serial.print("gp.buttons: "); Serial.println(gp.buttons, HEX);*/ + + while (!usb_hid.ready()) { + yield(); + } + usb_hid.sendReport(0, &gp, sizeof(gp)); + + // Continue to receive the next report + if (!tuh_hid_receive_report(dev_addr, instance)) { + Serial.println("Error: cannot request to receive report"); + } +} diff --git a/USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad/gamepad_reports.h b/USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad/gamepad_reports.h new file mode 100644 index 000000000..48f0e8226 --- /dev/null +++ b/USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad/gamepad_reports.h @@ -0,0 +1,55 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// HID reports for Logitech Gamepad F310 +// Update defines and combo_report for your gamepad and/or combo! + +// Byte indices for the gamepad report +#define BYTE_LEFT_STICK_X 0 // Left analog stick X-axis +#define BYTE_LEFT_STICK_Y 1 // Left analog stick Y-axis +#define BYTE_RIGHT_STICK_X 2 // Right analog stick X-axis +#define BYTE_RIGHT_STICK_Y 3 // Right analog stick Y-axis +#define BYTE_DPAD_BUTTONS 4 // D-Pad and face buttons +#define BYTE_MISC_BUTTONS 5 // Miscellaneous buttons (triggers, paddles, start, back) +#define BYTE_UNUSED 6 // Unused +#define BYTE_STATUS 7 // Status byte (usually constant) + +// Button masks for Byte[4] (DPAD and face buttons) +#define DPAD_MASK 0x07 // Bits 0-2 for D-Pad direction +#define DPAD_NEUTRAL 0x08 // Bit 3 set when D-Pad is neutral + +// D-Pad directions (use when DPAD_NEUTRAL is not set) +#define DPAD_UP 0x00 // 0000 +#define DPAD_UP_RIGHT 0x01 // 0001 +#define DPAD_RIGHT 0x02 // 0010 +#define DPAD_DOWN_RIGHT 0x03 // 0011 +#define DPAD_DOWN 0x04 // 0100 +#define DPAD_DOWN_LEFT 0x05 // 0101 +#define DPAD_LEFT 0x06 // 0110 +#define DPAD_UP_LEFT 0x07 // 0111 + +// Face buttons (Byte[4] bits 4-7) +#define BUTTON_X 0x10 +#define BUTTON_A 0x20 +#define BUTTON_B 0x40 +#define BUTTON_Y 0x80 + +// Button masks for Byte[5] (MISC buttons) +#define MISC_NEUTRAL 0x00 + +// Miscellaneous buttons (Byte[5]) +#define BUTTON_LEFT_PADDLE 0x01 +#define BUTTON_RIGHT_PADDLE 0x02 +#define BUTTON_LEFT_TRIGGER 0x04 +#define BUTTON_RIGHT_TRIGGER 0x08 +#define BUTTON_BACK 0x10 +#define BUTTON_START 0x20 + +#define LEFT_STICK_X_NEUTRAL 0x80 +#define LEFT_STICK_Y_NEUTRAL 0x7F +#define RIGHT_STICK_X_NEUTRAL 0x80 +#define RIGHT_STICK_Y_NEUTRAL 0x7F + +uint8_t combo_report[] = { BUTTON_A, BUTTON_LEFT_PADDLE, BUTTON_RIGHT_PADDLE }; +size_t combo_size = sizeof(combo_report) / sizeof(combo_report[0]); diff --git a/USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad/usbh_helper.h b/USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad/usbh_helper.h new file mode 100644 index 000000000..107f5c09f --- /dev/null +++ b/USB_Host_Turbo_Button_Gamepad/Arduino_USB_Host_Turbo_Button_Gamepad/usbh_helper.h @@ -0,0 +1,103 @@ +// SPDX-FileCopyrightText: 2024 Ha Thach for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/********************************************************************* + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + MIT license, check LICENSE for more information + Copyright (c) 2019 Ha Thach for Adafruit Industries + All text above, and the splash screen below must be included in + any redistribution +*********************************************************************/ + +#ifndef USBH_HELPER_H +#define USBH_HELPER_H + +#ifdef ARDUINO_ARCH_RP2040 + // pio-usb is required for rp2040 host + #include "pio_usb.h" + + // Pin D+ for host, D- = D+ + 1 + #ifndef PIN_USB_HOST_DP + #define PIN_USB_HOST_DP 16 + #endif + + // Pin for enabling Host VBUS. comment out if not used + #ifndef PIN_5V_EN + #define PIN_5V_EN 18 + #endif + + #ifndef PIN_5V_EN_STATE + #define PIN_5V_EN_STATE 1 + #endif +#endif // ARDUINO_ARCH_RP2040 + +#include "Adafruit_TinyUSB.h" + +#if defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421 + // USB Host using MAX3421E: SPI, CS, INT + #include "SPI.h" + + #if defined(ARDUINO_METRO_ESP32S2) + Adafruit_USBH_Host USBHost(&SPI, 15, 14); + #elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32_V2) + Adafruit_USBH_Host USBHost(&SPI, 33, 15); + #else + // Default CS and INT are pin 10, 9 + Adafruit_USBH_Host USBHost(&SPI, 10, 9); + #endif +#else + // Native USB Host such as rp2040 + Adafruit_USBH_Host USBHost; +#endif + +//--------------------------------------------------------------------+ +// Helper Functions +//--------------------------------------------------------------------+ + +#ifdef ARDUINO_ARCH_RP2040 +static void rp2040_configure_pio_usb(void) { + //while ( !Serial ) delay(10); // wait for native usb + Serial.println("Core1 setup to run TinyUSB host with pio-usb"); + + // Check for CPU frequency, must be multiple of 120Mhz for bit-banging USB + uint32_t cpu_hz = clock_get_hz(clk_sys); + if (cpu_hz != 120000000UL && cpu_hz != 240000000UL) { + while (!Serial) { + delay(10); // wait for native usb + } + Serial.printf("Error: CPU Clock = %lu, PIO USB require CPU clock must be multiple of 120 Mhz\r\n", cpu_hz); + Serial.printf("Change your CPU Clock to either 120 or 240 Mhz in Menu->CPU Speed \r\n"); + while (1) { + delay(1); + } + } + +#ifdef PIN_5V_EN + pinMode(PIN_5V_EN, OUTPUT); + digitalWrite(PIN_5V_EN, PIN_5V_EN_STATE); +#endif + + pio_usb_configuration_t pio_cfg = PIO_USB_DEFAULT_CONFIG; + pio_cfg.pin_dp = PIN_USB_HOST_DP; + +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) + // For pico-w, PIO is also used to communicate with cyw43 + // Therefore we need to alternate the pio-usb configuration + // details https://github.com/sekigon-gonnoc/Pico-PIO-USB/issues/46 + pio_cfg.sm_tx = 3; + pio_cfg.sm_rx = 2; + pio_cfg.sm_eop = 3; + pio_cfg.pio_rx_num = 0; + pio_cfg.pio_tx_num = 1; + pio_cfg.tx_ch = 9; +#endif + + USBHost.configure_pio_usb(1, &pio_cfg); +} +#endif + +#endif diff --git a/USB_Host_Turbo_Button_Gamepad/gamepad_device_report/.feather_rp2040_usbhost_tinyusb.test.only b/USB_Host_Turbo_Button_Gamepad/gamepad_device_report/.feather_rp2040_usbhost_tinyusb.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/USB_Host_Turbo_Button_Gamepad/gamepad_device_report/gamepad_device_report-adafruit_feather_usb_host.uf2 b/USB_Host_Turbo_Button_Gamepad/gamepad_device_report/gamepad_device_report-adafruit_feather_usb_host.uf2 new file mode 100644 index 000000000..746c92aa3 Binary files /dev/null and b/USB_Host_Turbo_Button_Gamepad/gamepad_device_report/gamepad_device_report-adafruit_feather_usb_host.uf2 differ diff --git a/USB_Host_Turbo_Button_Gamepad/gamepad_device_report/gamepad_device_report.ino b/USB_Host_Turbo_Button_Gamepad/gamepad_device_report/gamepad_device_report.ino new file mode 100644 index 000000000..977ce97ce --- /dev/null +++ b/USB_Host_Turbo_Button_Gamepad/gamepad_device_report/gamepad_device_report.ino @@ -0,0 +1,306 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/********************************************************************* + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + MIT license, check LICENSE for more information + Copyright (c) 2019 Ha Thach for Adafruit Industries + All text above, and the splash screen below must be included in + any redistribution +*********************************************************************/ + +/* This example demonstrates use of both device and host, where + * - Device runs on native USB controller (roothub port0) + * - Host depends on MCU: + * - rp2040: bit-banging 2 GPIOs with Pico-PIO-USB library (roothub port1) + * - samd21/51, nrf52840, esp32: using MAX3421e controller (host shield) + * + * Requirements: + * - For rp2040: + * - Pico-PIO-USB library + * - 2 consecutive GPIOs: D+ is defined by PIN_USB_HOST_DP, D- = D+ +1 + * - Provide VBus (5v) and GND for peripheral + * - CPU Speed must be either 120 or 240 MHz. Selected via "Menu -> CPU Speed" + * - For samd21/51, nrf52840, esp32: + * - Additional MAX2341e USB Host shield or featherwing is required + * - SPI instance, CS pin, INT pin are correctly configured in usbh_helper.h + */ + +/* Host example will get device descriptors of attached devices and print it out via + * device CDC (Serial) as follows: + * Device 1: ID 046d:c52f + Device Descriptor: + bLength 18 + bDescriptorType 1 + bcdUSB 0200 + bDeviceClass 0 + bDeviceSubClass 0 + bDeviceProtocol 0 + bMaxPacketSize0 8 + idVendor 0x046d + idProduct 0xc52f + bcdDevice 2200 + iManufacturer 1 Logitech + iProduct 2 USB Receiver + iSerialNumber 0 + bNumConfigurations 1 + * + */ + +// USBHost is defined in usbh_helper.h +#include "usbh_helper.h" +#include "tusb.h" + +// Language ID: English +#define LANGUAGE_ID 0x0409 + +typedef struct { + tusb_desc_device_t desc_device; + uint16_t manufacturer[32]; + uint16_t product[48]; + uint16_t serial[16]; + bool mounted; +} dev_info_t; + +// CFG_TUH_DEVICE_MAX is defined by tusb_config header +dev_info_t dev_info[CFG_TUH_DEVICE_MAX] = { 0 }; + +void setup() { + Serial.begin(115200); + +#if defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421 + // init host stack on controller (rhport) 1 + // For rp2040: this is called in core1's setup1() + USBHost.begin(1); +#endif + + Serial.println("TinyUSB Dual Device Info Example with HID Report"); +} + +#if defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421 +//--------------------------------------------------------------------+ +// Using Host shield MAX3421E controller +//--------------------------------------------------------------------+ +void loop() { + USBHost.task(); + Serial.flush(); +} + +#elif defined(ARDUINO_ARCH_RP2040) +//--------------------------------------------------------------------+ +// For RP2040 use both core0 for device stack, core1 for host stack +//--------------------------------------------------------------------// + +//------------- Core0 -------------// +void loop() { +} + +//------------- Core1 -------------// +void setup1() { + // configure pio-usb: defined in usbh_helper.h + rp2040_configure_pio_usb(); + + // run host stack on controller (rhport) 1 + // Note: For rp2040 pico-pio-usb, calling USBHost.begin() on core1 will have most of the + // host bit-banging processing works done in core1 to free up core0 for other works + USBHost.begin(1); +} + +void loop1() { + USBHost.task(); + Serial.flush(); +} +#endif + +//--------------------------------------------------------------------+ +// TinyUSB Host callbacks +//--------------------------------------------------------------------+ +void print_device_descriptor(tuh_xfer_t *xfer); + +void utf16_to_utf8(uint16_t *temp_buf, size_t buf_len); + +void print_lsusb(void) { + bool no_device = true; + for (uint8_t daddr = 1; daddr < CFG_TUH_DEVICE_MAX + 1; daddr++) { + // TODO can use tuh_mounted(daddr), but tinyusb has a bug + // use local connected flag instead + dev_info_t *dev = &dev_info[daddr - 1]; + if (dev->mounted) { + Serial.printf("Device %u: ID %04x:%04x %s %s\r\n", daddr, + dev->desc_device.idVendor, dev->desc_device.idProduct, + (char *) dev->manufacturer, (char *) dev->product); + + no_device = false; + } + } + + if (no_device) { + Serial.println("No device connected (except hub)"); + } +} + +// Invoked when device is mounted (configured) +void tuh_mount_cb(uint8_t daddr) { + Serial.printf("Device attached, address = %d\r\n", daddr); + + dev_info_t *dev = &dev_info[daddr - 1]; + dev->mounted = true; + + // Get Device Descriptor + tuh_descriptor_get_device(daddr, &dev->desc_device, 18, print_device_descriptor, 0); +} + +/// Invoked when device is unmounted (bus reset/unplugged) +void tuh_umount_cb(uint8_t daddr) { + Serial.printf("Device removed, address = %d\r\n", daddr); + dev_info_t *dev = &dev_info[daddr - 1]; + dev->mounted = false; + + // print device summary + print_lsusb(); +} + +void print_device_descriptor(tuh_xfer_t *xfer) { + if (XFER_RESULT_SUCCESS != xfer->result) { + Serial.printf("Failed to get device descriptor\r\n"); + return; + } + + uint8_t const daddr = xfer->daddr; + dev_info_t *dev = &dev_info[daddr - 1]; + tusb_desc_device_t *desc = &dev->desc_device; + + Serial.printf("Device %u: ID %04x:%04x\r\n", daddr, desc->idVendor, desc->idProduct); + Serial.printf("Device Descriptor:\r\n"); + Serial.printf(" bLength %u\r\n" , desc->bLength); + Serial.printf(" bDescriptorType %u\r\n" , desc->bDescriptorType); + Serial.printf(" bcdUSB %04x\r\n" , desc->bcdUSB); + Serial.printf(" bDeviceClass %u\r\n" , desc->bDeviceClass); + Serial.printf(" bDeviceSubClass %u\r\n" , desc->bDeviceSubClass); + Serial.printf(" bDeviceProtocol %u\r\n" , desc->bDeviceProtocol); + Serial.printf(" bMaxPacketSize0 %u\r\n" , desc->bMaxPacketSize0); + Serial.printf(" idVendor 0x%04x\r\n" , desc->idVendor); + Serial.printf(" idProduct 0x%04x\r\n" , desc->idProduct); + Serial.printf(" bcdDevice %04x\r\n" , desc->bcdDevice); + + // Get String descriptor using Sync API + Serial.printf(" iManufacturer %u ", desc->iManufacturer); + if (XFER_RESULT_SUCCESS == + tuh_descriptor_get_manufacturer_string_sync(daddr, LANGUAGE_ID, dev->manufacturer, sizeof(dev->manufacturer))) { + utf16_to_utf8(dev->manufacturer, sizeof(dev->manufacturer)); + Serial.printf((char *) dev->manufacturer); + } + Serial.printf("\r\n"); + + Serial.printf(" iProduct %u ", desc->iProduct); + if (XFER_RESULT_SUCCESS == + tuh_descriptor_get_product_string_sync(daddr, LANGUAGE_ID, dev->product, sizeof(dev->product))) { + utf16_to_utf8(dev->product, sizeof(dev->product)); + Serial.printf((char *) dev->product); + } + Serial.printf("\r\n"); + + Serial.printf(" iSerialNumber %u ", desc->iSerialNumber); + if (XFER_RESULT_SUCCESS == + tuh_descriptor_get_serial_string_sync(daddr, LANGUAGE_ID, dev->serial, sizeof(dev->serial))) { + utf16_to_utf8(dev->serial, sizeof(dev->serial)); + Serial.printf((char *) dev->serial); + } + Serial.printf("\r\n"); + + Serial.printf(" bNumConfigurations %u\r\n", desc->bNumConfigurations); + + // print device summary + print_lsusb(); +} + +//--------------------------------------------------------------------+ +// String Descriptor Helper +//--------------------------------------------------------------------+ + +static void _convert_utf16le_to_utf8(const uint16_t *utf16, size_t utf16_len, uint8_t *utf8, size_t utf8_len) { + // TODO: Check for runover. + (void) utf8_len; + // Get the UTF-16 length out of the data itself. + + for (size_t i = 0; i < utf16_len; i++) { + uint16_t chr = utf16[i]; + if (chr < 0x80) { + *utf8++ = chr & 0xff; + } else if (chr < 0x800) { + *utf8++ = (uint8_t) (0xC0 | (chr >> 6 & 0x1F)); + *utf8++ = (uint8_t) (0x80 | (chr >> 0 & 0x3F)); + } else { + // TODO: Verify surrogate. + *utf8++ = (uint8_t) (0xE0 | (chr >> 12 & 0x0F)); + *utf8++ = (uint8_t) (0x80 | (chr >> 6 & 0x3F)); + *utf8++ = (uint8_t) (0x80 | (chr >> 0 & 0x3F)); + } + // TODO: Handle UTF-16 code points that take two entries. + } +} + +// Count how many bytes a utf-16-le encoded string will take in utf-8. +static int _count_utf8_bytes(const uint16_t *buf, size_t len) { + size_t total_bytes = 0; + for (size_t i = 0; i < len; i++) { + uint16_t chr = buf[i]; + if (chr < 0x80) { + total_bytes += 1; + } else if (chr < 0x800) { + total_bytes += 2; + } else { + total_bytes += 3; + } + // TODO: Handle UTF-16 code points that take two entries. + } + return total_bytes; +} + +void utf16_to_utf8(uint16_t *temp_buf, size_t buf_len) { + size_t utf16_len = ((temp_buf[0] & 0xff) - 2) / sizeof(uint16_t); + size_t utf8_len = _count_utf8_bytes(temp_buf + 1, utf16_len); + + _convert_utf16le_to_utf8(temp_buf + 1, utf16_len, (uint8_t *) temp_buf, buf_len); + ((uint8_t *) temp_buf)[utf8_len] = '\0'; +} + +//--------------------------------------------------------------------+ +// HID Host Callback Functions +//--------------------------------------------------------------------+ + +void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* desc_report, uint16_t desc_len) +{ + Serial.printf("HID device mounted (address %d, instance %d)\n", dev_addr, instance); + + // Start receiving HID reports + if (!tuh_hid_receive_report(dev_addr, instance)) + { + Serial.printf("Error: cannot request to receive report\n"); + } +} + +void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) +{ + Serial.printf("HID device unmounted (address %d, instance %d)\n", dev_addr, instance); +} + +void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len) +{ + Serial.printf("Received HID report from device %d instance %d: ", dev_addr, instance); + for (uint16_t i = 0; i < len; i++) + { + Serial.printf("%02X ", report[i]); + } + Serial.printf("\n"); + + // Continue to receive the next report + if (!tuh_hid_receive_report(dev_addr, instance)) + { + Serial.printf("Error: cannot request to receive report\n"); + } +} diff --git a/USB_Host_Turbo_Button_Gamepad/gamepad_device_report/usbh_helper.h b/USB_Host_Turbo_Button_Gamepad/gamepad_device_report/usbh_helper.h new file mode 100644 index 000000000..107f5c09f --- /dev/null +++ b/USB_Host_Turbo_Button_Gamepad/gamepad_device_report/usbh_helper.h @@ -0,0 +1,103 @@ +// SPDX-FileCopyrightText: 2024 Ha Thach for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +/********************************************************************* + Adafruit invests time and resources providing this open source code, + please support Adafruit and open-source hardware by purchasing + products from Adafruit! + + MIT license, check LICENSE for more information + Copyright (c) 2019 Ha Thach for Adafruit Industries + All text above, and the splash screen below must be included in + any redistribution +*********************************************************************/ + +#ifndef USBH_HELPER_H +#define USBH_HELPER_H + +#ifdef ARDUINO_ARCH_RP2040 + // pio-usb is required for rp2040 host + #include "pio_usb.h" + + // Pin D+ for host, D- = D+ + 1 + #ifndef PIN_USB_HOST_DP + #define PIN_USB_HOST_DP 16 + #endif + + // Pin for enabling Host VBUS. comment out if not used + #ifndef PIN_5V_EN + #define PIN_5V_EN 18 + #endif + + #ifndef PIN_5V_EN_STATE + #define PIN_5V_EN_STATE 1 + #endif +#endif // ARDUINO_ARCH_RP2040 + +#include "Adafruit_TinyUSB.h" + +#if defined(CFG_TUH_MAX3421) && CFG_TUH_MAX3421 + // USB Host using MAX3421E: SPI, CS, INT + #include "SPI.h" + + #if defined(ARDUINO_METRO_ESP32S2) + Adafruit_USBH_Host USBHost(&SPI, 15, 14); + #elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32_V2) + Adafruit_USBH_Host USBHost(&SPI, 33, 15); + #else + // Default CS and INT are pin 10, 9 + Adafruit_USBH_Host USBHost(&SPI, 10, 9); + #endif +#else + // Native USB Host such as rp2040 + Adafruit_USBH_Host USBHost; +#endif + +//--------------------------------------------------------------------+ +// Helper Functions +//--------------------------------------------------------------------+ + +#ifdef ARDUINO_ARCH_RP2040 +static void rp2040_configure_pio_usb(void) { + //while ( !Serial ) delay(10); // wait for native usb + Serial.println("Core1 setup to run TinyUSB host with pio-usb"); + + // Check for CPU frequency, must be multiple of 120Mhz for bit-banging USB + uint32_t cpu_hz = clock_get_hz(clk_sys); + if (cpu_hz != 120000000UL && cpu_hz != 240000000UL) { + while (!Serial) { + delay(10); // wait for native usb + } + Serial.printf("Error: CPU Clock = %lu, PIO USB require CPU clock must be multiple of 120 Mhz\r\n", cpu_hz); + Serial.printf("Change your CPU Clock to either 120 or 240 Mhz in Menu->CPU Speed \r\n"); + while (1) { + delay(1); + } + } + +#ifdef PIN_5V_EN + pinMode(PIN_5V_EN, OUTPUT); + digitalWrite(PIN_5V_EN, PIN_5V_EN_STATE); +#endif + + pio_usb_configuration_t pio_cfg = PIO_USB_DEFAULT_CONFIG; + pio_cfg.pin_dp = PIN_USB_HOST_DP; + +#if defined(ARDUINO_RASPBERRY_PI_PICO_W) + // For pico-w, PIO is also used to communicate with cyw43 + // Therefore we need to alternate the pio-usb configuration + // details https://github.com/sekigon-gonnoc/Pico-PIO-USB/issues/46 + pio_cfg.sm_tx = 3; + pio_cfg.sm_rx = 2; + pio_cfg.sm_eop = 3; + pio_cfg.pio_rx_num = 0; + pio_cfg.pio_tx_num = 1; + pio_cfg.tx_ch = 9; +#endif + + USBHost.configure_pio_usb(1, &pio_cfg); +} +#endif + +#endif diff --git a/USB_Host_to_BLE_Arduino/.feather_esp32s3_tft.test.only b/USB_Host_to_BLE_Arduino/.feather_esp32s3_tft.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/USB_Host_to_BLE_Arduino/USB_Host_to_BLE_Arduino.ino b/USB_Host_to_BLE_Arduino/USB_Host_to_BLE_Arduino.ino new file mode 100644 index 000000000..e6d2cf934 --- /dev/null +++ b/USB_Host_to_BLE_Arduino/USB_Host_to_BLE_Arduino.ino @@ -0,0 +1,316 @@ +// SPDX-FileCopyrightText: 2024 Liz Clark for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Uses the Adafruit ESP32-S3 TFT with the MAX3421E FeatherWing +// Acts as a USB keyboard to BLE converter + +#include +#include "Adafruit_TinyUSB.h" +#include "BLEDevice.h" +#include "BLEHIDDevice.h" +#include "HIDTypes.h" +#include "HIDKeyboardTypes.h" +#include "Adafruit_MAX1704X.h" +#include "Adafruit_LC709203F.h" +#include +#include + +Adafruit_USBH_Host USBHost(&SPI, 10, 9); + +#define US_KEYBOARD 1 +#define DEVICE_NAME "ESP32 Keyboard" +#define BLE_MANUFACTURER "TinyUSB" + +Adafruit_LC709203F lc_bat; +Adafruit_MAX17048 max_bat; + +Adafruit_ST7789 display = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST); +BLEHIDDevice* hid; +BLECharacteristic* input; +BLECharacteristic* output; +String keyInput = ""; + +GFXcanvas16 canvas(240, 135); + +bool maxfound = false; +bool lcfound = false; +bool isBleConnected = false; + +unsigned long previousMillis = 0; +const long interval = 500; + +void setup() { + Serial.begin(115200); + // while ( !Serial ) delay(10); // wait for native usb + // turn on the TFT / I2C power supply + pinMode(TFT_I2C_POWER, OUTPUT); + digitalWrite(TFT_I2C_POWER, HIGH); + pinMode(TFT_BACKLITE, OUTPUT); + digitalWrite(TFT_BACKLITE, HIGH); + display.init(135, 240); // Init ST7789 240x135 + display.setRotation(3); + canvas.setFont(&FreeSans12pt7b); + canvas.setTextColor(ST77XX_WHITE); + canvas.fillScreen(ST77XX_BLACK); + canvas.setCursor(0, 25); + canvas.println("Connecting to BLE.."); + display.drawRGBBitmap(0, 0, canvas.getBuffer(), 240, 135); + // start Bluetooth task + xTaskCreate(bluetoothTask, "bluetooth", 20000, NULL, 5, NULL); + canvas.fillScreen(ST77XX_BLACK); + canvas.setCursor(0, 25); + canvas.println("BLE Connected!"); + canvas.println("Finding USB device.."); + display.drawRGBBitmap(0, 0, canvas.getBuffer(), 240, 135); + // init host stack on controller (rhport) 1 + USBHost.begin(1); + Serial.println("TinyUSB Dual: HID Device to ESP BLE Keyboard"); + canvas.fillScreen(ST77XX_BLACK); + canvas.setCursor(0, 25); + canvas.println("BLE Connected!"); + canvas.println("USB Connected!"); + display.drawRGBBitmap(0, 0, canvas.getBuffer(), 240, 135); + + if (lc_bat.begin()) { + Serial.println("Found LC709203F"); + Serial.print("Version: 0x"); Serial.println(lc_bat.getICversion(), HEX); + lc_bat.setPackSize(LC709203F_APA_500MAH); + lcfound = true; + } + else { + Serial.println(F("Couldnt find Adafruit LC709203F?\nChecking for Adafruit MAX1704X..")); + delay(200); + if (!max_bat.begin()) { + Serial.println(F("Couldnt find Adafruit MAX1704X?\nMake sure a battery is plugged in!")); + while (1) delay(10); + } + Serial.print(F("Found MAX17048")); + Serial.print(F(" with Chip ID: 0x")); + Serial.println(max_bat.getChipID(), HEX); + maxfound = true; + } +} + +void loop() { + unsigned long currentMillis = millis(); + USBHost.task(); + //Serial.flush(); + if (currentMillis - previousMillis >= interval) { + previousMillis = currentMillis; + canvas.fillScreen(ST77XX_BLACK); + canvas.setCursor(0, 25); + canvas.setTextColor(ST77XX_RED); + canvas.println("Adafruit Feather"); + canvas.setTextColor(ST77XX_YELLOW); + canvas.println("USB Host -> BLE"); + canvas.setTextColor(ST77XX_GREEN); + canvas.print("Battery: "); + canvas.setTextColor(ST77XX_WHITE); + if (lcfound == true) { + canvas.print(lc_bat.cellVoltage(), 1); + canvas.print(" V / "); + canvas.print(lc_bat.cellPercent(), 0); + canvas.println("%"); + hid->setBatteryLevel(lc_bat.cellPercent()); + } else { + canvas.print(max_bat.cellVoltage(), 1); + canvas.print(" V / "); + canvas.print(max_bat.cellPercent(), 0); + canvas.println("%"); + hid->setBatteryLevel(max_bat.cellPercent()); + } + canvas.setTextColor(ST77XX_BLUE); + canvas.print("Sent: "); + canvas.setTextColor(ST77XX_WHITE); + canvas.println(keyInput); + display.drawRGBBitmap(0, 0, canvas.getBuffer(), 240, 135); + + } +} +void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *msg, uint16_t len); + + +// Message (report) sent when a key is pressed or released +struct InputReport { + uint8_t modifiers; // bitmask: CTRL = 1, SHIFT = 2, ALT = 4 + uint8_t reserved; // must be 0 + uint8_t pressedKeys[6]; // up to six concurrenlty pressed keys +}; + +// The report map describes the HID device (a keyboard in this case) and +// the messages (reports in HID terms) sent and received. +static const uint8_t REPORT_MAP[] = { + USAGE_PAGE(1), 0x01, // Generic Desktop Controls + USAGE(1), 0x06, // Keyboard + COLLECTION(1), 0x01, // Application + REPORT_ID(1), 0x01, // Report ID (1) + USAGE_PAGE(1), 0x07, // Keyboard/Keypad + USAGE_MINIMUM(1), 0xE0, // Keyboard Left Control + USAGE_MAXIMUM(1), 0xE7, // Keyboard Right Control + LOGICAL_MINIMUM(1), 0x00, // Each bit is either 0 or 1 + LOGICAL_MAXIMUM(1), 0x01, + REPORT_COUNT(1), 0x08, // 8 bits for the modifier keys + REPORT_SIZE(1), 0x01, + HIDINPUT(1), 0x02, // Data, Var, Abs + REPORT_COUNT(1), 0x01, // 1 byte (unused) + REPORT_SIZE(1), 0x08, + HIDINPUT(1), 0x01, // Const, Array, Abs + REPORT_COUNT(1), 0x06, // 6 bytes (for up to 6 concurrently pressed keys) + REPORT_SIZE(1), 0x08, + LOGICAL_MINIMUM(1), 0x00, + LOGICAL_MAXIMUM(1), 0x65, // 101 keys + USAGE_MINIMUM(1), 0x00, + USAGE_MAXIMUM(1), 0x65, + HIDINPUT(1), 0x00, // Data, Array, Abs + REPORT_COUNT(1), 0x05, // 5 bits (Num lock, Caps lock, Scroll lock, Compose, Kana) + REPORT_SIZE(1), 0x01, + USAGE_PAGE(1), 0x08, // LEDs + USAGE_MINIMUM(1), 0x01, // Num Lock + USAGE_MAXIMUM(1), 0x05, // Kana + LOGICAL_MINIMUM(1), 0x00, + LOGICAL_MAXIMUM(1), 0x01, + HIDOUTPUT(1), 0x02, // Data, Var, Abs + REPORT_COUNT(1), 0x01, // 3 bits (Padding) + REPORT_SIZE(1), 0x03, + HIDOUTPUT(1), 0x01, // Const, Array, Abs + END_COLLECTION(0) // End application collection +}; + +const InputReport NO_KEY_PRESSED = { }; + +/* + * Callbacks related to BLE connection + */ +class BleKeyboardCallbacks : public BLEServerCallbacks { + + void onConnect(BLEServer* server) { + isBleConnected = true; + + // Allow notifications for characteristics + BLE2902* cccDesc = (BLE2902*)input->getDescriptorByUUID(BLEUUID((uint16_t)0x2902)); + cccDesc->setNotifications(true); + + Serial.println("Client has connected"); + } + + void onDisconnect(BLEServer* server) { + isBleConnected = false; + + // Disallow notifications for characteristics + BLE2902* cccDesc = (BLE2902*)input->getDescriptorByUUID(BLEUUID((uint16_t)0x2902)); + cccDesc->setNotifications(false); + + Serial.println("Client has disconnected"); + } +}; + +void bluetoothTask(void*) { + + BLEDevice::init(DEVICE_NAME); + BLEServer* server = BLEDevice::createServer(); + server->setCallbacks(new BleKeyboardCallbacks()); + + // create an HID device + hid = new BLEHIDDevice(server); + input = hid->inputReport(1); // report ID + + // set manufacturer name + hid->manufacturer()->setValue(BLE_MANUFACTURER); + // set USB vendor and product ID + hid->pnp(0x02, 0xe502, 0xa111, 0x0210); + // information about HID device: device is not localized, device can be connected + hid->hidInfo(0x00, 0x02); + // Security: device requires bonding + BLESecurity* security = new BLESecurity(); + security->setAuthenticationMode(ESP_LE_AUTH_BOND); + + // set report map + hid->reportMap((uint8_t*)REPORT_MAP, sizeof(REPORT_MAP)); + hid->startServices(); + + // set battery level to 100% + hid->setBatteryLevel(100); + + // advertise the services + BLEAdvertising* advertising = server->getAdvertising(); + advertising->setAppearance(HID_KEYBOARD); + advertising->addServiceUUID(hid->hidService()->getUUID()); + advertising->addServiceUUID(hid->deviceInfo()->getUUID()); + advertising->addServiceUUID(hid->batteryService()->getUUID()); + advertising->start(); + + Serial.println("BLE ready"); + delay(portMAX_DELAY); +}; + +extern "C" { + +// Invoked when device with hid interface is mounted +// Report descriptor is also available for use. +// tuh_hid_parse_report_descriptor() can be used to parse common/simple enough +// descriptor. Note: if report descriptor length > CFG_TUH_ENUMERATION_BUFSIZE, +// it will be skipped therefore report_desc = NULL, desc_len = 0 +void tuh_hid_mount_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *desc_report, uint16_t desc_len) { + + (void) desc_report; + (void) desc_len; + uint16_t vid, pid; + tuh_vid_pid_get(dev_addr, &vid, &pid); + + Serial.printf("HID device address = %d, instance = %d is mounted\r\n", dev_addr, instance); + Serial.printf("VID = %04x, PID = %04x\r\n", vid, pid); + hid->pnp(0x02, vid, 0xa111, pid); + if (!tuh_hid_receive_report(dev_addr, instance)) { + Serial.printf("Error: cannot request to receive report\r\n"); + } +} + +// Invoked when device with hid interface is un-mounted +void tuh_hid_umount_cb(uint8_t dev_addr, uint8_t instance) { + Serial.printf("HID device address = %d, instance = %d is unmounted\r\n", dev_addr, instance); +} + +// Invoked when received report from device via interrupt endpoint +void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const *msg, uint16_t len) { + // continue to request to receive report + //unsigned long a = millis(); + if (!isBleConnected) return; + //Serial.println(messageLength); + if (msg[2] != 0) { + for (uint8_t i = 2; i < len; i++) { + // translate character to key combination + // Assuming your USB message fits the format required by the BLE keyboard + // You might need to adjust this depending on your actual USB message format + + InputReport report = { + .modifiers = msg[0], // No modifier for now + .reserved = 0, + .pressedKeys = {msg[i], 0, 0, 0, 0, 0} + }; + input->setValue((uint8_t*)&report, sizeof(report)); + input->notify(); + delay(1); + // release all keys between two characters; otherwise two identical + // consecutive characters are treated as just one key press + input->setValue((uint8_t*)&NO_KEY_PRESSED, sizeof(NO_KEY_PRESSED)); + input->notify(); + delay(1); + } + char formattedString[6]; // Large enough for "0x" + 2 hex digits + null terminator + sprintf(formattedString, "0x%02X", msg[2]); + //if (strcmp(formattedString, "0x00") != 0) { + keyInput = ""; + keyInput = formattedString; + //Serial.println(keyInput); + //} + } + //sendUSBMessageOverBLE(report, len); + if (!tuh_hid_receive_report(dev_addr, instance)) { + Serial.printf("Error: cannot request to receive report\r\n"); + } + //unsigned long b = millis(); + //Serial.println(b-a); +} + +} // extern C diff --git a/USB_MIDI_Host_Messenger/.feather_rp2040_usbhost_tinyusb.test.only b/USB_MIDI_Host_Messenger/.feather_rp2040_usbhost_tinyusb.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/USB_MIDI_Host_Messenger/USB_MIDI_Host_Messenger.ino b/USB_MIDI_Host_Messenger/USB_MIDI_Host_Messenger.ino new file mode 100644 index 000000000..64ee4da0a --- /dev/null +++ b/USB_MIDI_Host_Messenger/USB_MIDI_Host_Messenger.ino @@ -0,0 +1,541 @@ +// SPDX-FileCopyrightText: 2024 john park for Adafruit Industries +// +// SPDX-License-Identifier: MIT +/** + * For USB MIDI Host Feather RP2040 with mini OLED FeatherWing and MIDI FeatherWing + * Modified 12 Jun 2024 - @todbot -- added USB MIDI forwarding + * Modified by @johnedgarpark -- added UART MIDI forwarding and display/message filtering + * originally from: https://github.com/rppicomidi/EZ_USB_MIDI_HOST/blob/main/examples/arduino/EZ_USB_MIDI_HOST_PIO_example/EZ_USB_MIDI_HOST_PIO_example.ino + */ + + /* + * The MIT License (MIT) + * + * Copyright (c) 2023 rppicomidi + * + * 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 THE + * AUTHORS OR COPYRIGHT HOLDERS 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. + * + */ + +/** + * This demo program is designed to test the USB MIDI Host driver for a single USB + * MIDI device connected to the USB Host port. It also + * forwards MIDI received from the USB MIDI device to USB and UART MIDI devices. + * + * This program works with a single USB MIDI device connected via a USB hub, but it + * does not handle multiple USB MIDI devices connected at the same time. + * + * Libraries (all available via library manager): + * - MIDI -- https://github.com/FortySevenEffects/arduino_midi_library + + */ +// Be sure to set the CPU clock to 120MHz or 240MHz before uploading to board +// USB Stack is TinyUSB +// Press A to change output MIDI channel +// Press B to change Program Change banks in groups of 8 +// Press C for MIDI panic + + +#include +#include +#include +#include + +//#define WIRE Wire1 //only if display needs it. +#define SCREEN_WIDTH 128 // OLED display width, in pixels +#define SCREEN_HEIGHT 32 // OLED display height, in pixels +#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin) +#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for OLED FeatherWing 128x32 +Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); + +//Screen buttons +const int buttonAPin = 9; +const int buttonBPin = 6; +const int buttonCPin = 5; +int buttonAState; +int buttonBState; +int buttonCState; +int lastButtonAState; +int lastButtonBState; +int lastButtonCState; +unsigned long lastDebounceATime = 0; +unsigned long lastDebounceBTime = 0; +unsigned long lastDebounceCTime = 0; +unsigned long debounceDelay = 50; + +int userChannel = 1; //1-16 +int userProgOffset = 0; + +#include + +#if defined(USE_TINYUSB_HOST) || !defined(USE_TINYUSB) +#error "Please use the Menu to select Tools->USB Stack: Adafruit TinyUSB" +#endif +#include "pio_usb.h" +#define HOST_PIN_DP 16 // Pin used as D+ for host, D- = D+ + 1 +#include "EZ_USB_MIDI_HOST.h" + +// USB Host object +Adafruit_USBH_Host USBHost; + +USING_NAMESPACE_MIDI +USING_NAMESPACE_EZ_USB_MIDI_HOST + +RPPICOMIDI_EZ_USB_MIDI_HOST_INSTANCE(usbhMIDI, MidiHostSettingsDefault) + +Adafruit_USBD_MIDI usb_midi; // USB MIDI object +MIDI_CREATE_INSTANCE(Adafruit_USBD_MIDI, usb_midi, MIDIusb); // USB MIDI +MIDI_CREATE_INSTANCE(HardwareSerial, Serial1, MIDIuart); // Serial MIDI over MIDI FeatherWing + +static uint8_t midiDevAddr = 0; + +static bool core0_booting = true; +static bool core1_booting = true; + +/* MIDI IN MESSAGE REPORTING */ +static void onMidiError(int8_t errCode) +{ + Serial.printf("MIDI Errors: %s %s %s\r\n", (errCode & (1UL << ErrorParse)) ? "Parse":"", + (errCode & (1UL << ErrorActiveSensingTimeout)) ? "Active Sensing Timeout" : "", + (errCode & (1UL << WarningSplitSysEx)) ? "Split SysEx":""); +} +int last_cc_cntrl = 1; + +static void midiPanic() +{ + for (int i=0; i<128; i++) + { + MIDIusb.sendNoteOff(i, 0, userChannel); + MIDIuart.sendNoteOff(i, 0, userChannel); + Serial.printf("note %u off\r\n", i); + last_cc_cntrl = 0; // dirty this + } +} + +static void onNoteOff(Channel channel, byte note, byte velocity) +{ + MIDIusb.sendNoteOff(note, velocity, userChannel); + MIDIuart.sendNoteOff(note, velocity, userChannel); + Serial.printf("ch%u: Note off#%u v=%u\r\n", userChannel, note, velocity); + + display.setCursor(0,12); + display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); + display.setTextWrap(false); + display.printf("Ch %u > %u Note %u \r\n", channel, userChannel, note); + display.display(); + last_cc_cntrl = 0; +} + +static void onNoteOn(Channel channel, byte note, byte velocity) +{ + MIDIusb.sendNoteOn(note, velocity, userChannel); + MIDIuart.sendNoteOn(note, velocity, userChannel); + Serial.printf("ch%u: Note on#%u v=%u\r\n", userChannel, note, velocity); + + display.setCursor(0,12); + display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); + display.setTextWrap(false); + display.printf("Ch %u > %u Note %u o\r\n", channel, userChannel, note); + display.display(); + last_cc_cntrl = 0; + +} + +static void onPolyphonicAftertouch(Channel channel, byte note, byte amount) +{ + Serial.printf("ch%u: PAT#%u=%u\r\n", userChannel, note, amount); + MIDIusb.sendAfterTouch(note, amount, userChannel); + MIDIuart.sendAfterTouch(note, amount, userChannel); +} + + +static void onControlChange(Channel channel, byte controller, byte value) +{ + MIDIusb.sendControlChange(controller, value, userChannel); + MIDIuart.sendControlChange(controller, value, userChannel); + Serial.printf("Ch %u CC#%u=%u\r\n", userChannel, controller, value); + if (last_cc_cntrl != controller){ + display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); + display.setTextWrap(false); + display.setCursor(0,12); + display.printf("CC# %u \r\n", controller); + display.display(); + last_cc_cntrl = controller; + } + +} + +static void onProgramChange(Channel channel, byte program) +{ + Serial.printf("ch%u: Prog=%u\r\n", userChannel, program); + MIDIusb.sendProgramChange(program + userProgOffset, userChannel); + MIDIuart.sendProgramChange(program + userProgOffset, userChannel); + display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); + display.setCursor(0,24); + display.printf("Progs %u-%u [%u] \r\n", userProgOffset, (userProgOffset + 7), (program + userProgOffset)); + display.display(); + last_cc_cntrl = 0; // dirty this + +} + +static void onAftertouch(Channel channel, byte value) +{ + Serial.printf("ch%u: AT=%u\r\n", userChannel, value); + MIDIusb.sendAfterTouch(value, userChannel); + MIDIuart.sendAfterTouch(value, userChannel); +} + +static void onPitchBend(Channel channel, int value) +{ + Serial.printf("ch%u: PB=%d\r\n", userChannel, value); + MIDIusb.sendPitchBend(value, userChannel); + MIDIuart.sendPitchBend(value, userChannel); +} + +static void onSysEx(byte * array, unsigned size) +{ + Serial.printf("SysEx:\r\n"); + unsigned multipleOf8 = size/8; + unsigned remOf8 = size % 8; + for (unsigned idx=0; idx < multipleOf8; idx++) { + for (unsigned jdx = 0; jdx < 8; jdx++) { + Serial.printf("%02x ", *array++); + } + Serial.printf("\r\n"); + } + for (unsigned idx = 0; idx < remOf8; idx++) { + Serial.printf("%02x ", *array++); + } + Serial.printf("\r\n"); +} + +static void onSMPTEqf(byte data) +{ + uint8_t type = (data >> 4) & 0xF; + data &= 0xF; + static const char* fps[4] = {"24", "25", "30DF", "30ND"}; + switch (type) { + case 0: Serial.printf("SMPTE FRM LS %u \r\n", data); break; + case 1: Serial.printf("SMPTE FRM MS %u \r\n", data); break; + case 2: Serial.printf("SMPTE SEC LS %u \r\n", data); break; + case 3: Serial.printf("SMPTE SEC MS %u \r\n", data); break; + case 4: Serial.printf("SMPTE MIN LS %u \r\n", data); break; + case 5: Serial.printf("SMPTE MIN MS %u \r\n", data); break; + case 6: Serial.printf("SMPTE HR LS %u \r\n", data); break; + case 7: + Serial.printf("SMPTE HR MS %u FPS:%s\r\n", data & 0x1, fps[(data >> 1) & 3]); + break; + default: + Serial.printf("invalid SMPTE data byte %u\r\n", data); + break; + } +} + +static void onSongPosition(unsigned beats) +{ + Serial.printf("SongP=%u\r\n", beats); + MIDIusb.sendSongPosition(beats); + MIDIuart.sendSongPosition(beats); +} + +static void onSongSelect(byte songnumber) +{ + Serial.printf("SongS#%u\r\n", songnumber); + MIDIusb.sendSongSelect(songnumber); + MIDIuart.sendSongSelect(songnumber); +} + +static void onTuneRequest() +{ + Serial.printf("Tune\r\n"); + MIDIusb.sendTuneRequest(); + MIDIuart.sendTuneRequest(); +} + +static void onMidiClock() +{ + Serial.printf("Clock\r\n"); + MIDIusb.sendClock(); + MIDIuart.sendClock(); +} + +static void onMidiStart() +{ + Serial.printf("Start\r\n"); + MIDIusb.sendStart(); + MIDIuart.sendStart(); +} + +static void onMidiContinue() +{ + Serial.printf("Cont\r\n"); + MIDIusb.sendContinue(); + MIDIuart.sendContinue(); +} + +static void onMidiStop() +{ + Serial.printf("Stop\r\n"); + MIDIusb.sendStop(); + MIDIuart.sendStop(); +} + +static void onActiveSense() +{ + Serial.printf("ASen\r\n"); +} + +static void onSystemReset() +{ + Serial.printf("SysRst\r\n"); +} + +static void onMidiTick() +{ + Serial.printf("Tick\r\n"); +} + +static void onMidiInWriteFail(uint8_t devAddr, uint8_t cable, bool fifoOverflow) +{ + if (fifoOverflow) + Serial.printf("Dev %u cable %u: MIDI IN FIFO overflow\r\n", devAddr, cable); + else + Serial.printf("Dev %u cable %u: MIDI IN FIFO error\r\n", devAddr, cable); +} + +static void registerMidiInCallbacks() +{ + auto intf = usbhMIDI.getInterfaceFromDeviceAndCable(midiDevAddr, 0); + if (intf == nullptr) + return; + intf->setHandleNoteOff(onNoteOff); // 0x80 + intf->setHandleNoteOn(onNoteOn); // 0x90 + intf->setHandleAfterTouchPoly(onPolyphonicAftertouch); // 0xA0 + intf->setHandleControlChange(onControlChange); // 0xB0 + intf->setHandleProgramChange(onProgramChange); // 0xC0 + intf->setHandleAfterTouchChannel(onAftertouch); // 0xD0 + intf->setHandlePitchBend(onPitchBend); // 0xE0 + intf->setHandleSystemExclusive(onSysEx); // 0xF0, 0xF7 + intf->setHandleTimeCodeQuarterFrame(onSMPTEqf); // 0xF1 + intf->setHandleSongPosition(onSongPosition); // 0xF2 + intf->setHandleSongSelect(onSongSelect); // 0xF3 + intf->setHandleTuneRequest(onTuneRequest); // 0xF6 + intf->setHandleClock(onMidiClock); // 0xF8 + // 0xF9 as 10ms Tick is not MIDI 1.0 standard but implemented in the Arduino MIDI Library + intf->setHandleTick(onMidiTick); // 0xF9 + intf->setHandleStart(onMidiStart); // 0xFA + intf->setHandleContinue(onMidiContinue); // 0xFB + intf->setHandleStop(onMidiStop); // 0xFC + intf->setHandleActiveSensing(onActiveSense); // 0xFE + intf->setHandleSystemReset(onSystemReset); // 0xFF + intf->setHandleError(onMidiError); + + auto dev = usbhMIDI.getDevFromDevAddr(midiDevAddr); + if (dev == nullptr) + return; + dev->setOnMidiInWriteFail(onMidiInWriteFail); +} + +/* CONNECTION MANAGEMENT */ +static void onMIDIconnect(uint8_t devAddr, uint8_t nInCables, uint8_t nOutCables) +{ + Serial.printf("MIDI device at address %u has %u IN cables and %u OUT cables\r\n", devAddr, nInCables, nOutCables); + midiDevAddr = devAddr; + registerMidiInCallbacks(); +} + +static void onMIDIdisconnect(uint8_t devAddr) +{ + Serial.printf("MIDI device at address %u unplugged\r\n", devAddr); + midiDevAddr = 0; +} + + +/* MAIN LOOP FUNCTIONS */ + +static void blinkLED(void) +{ + const uint32_t intervalMs = 1000; + static uint32_t startMs = 0; + + static bool ledState = false; + if ( millis() - startMs < intervalMs) + return; + startMs += intervalMs; + + ledState = !ledState; + digitalWrite(LED_BUILTIN, ledState ? HIGH:LOW); +} + + + +// core1's setup +void setup1() { + #if ARDUINO_ADAFRUIT_FEATHER_RP2040_USB_HOST + pinMode(18, OUTPUT); // Sets pin USB_HOST_5V_POWER to HIGH to enable USB power + digitalWrite(18, HIGH); + #endif + + //while(!Serial); // wait for native usb + Serial.println("Core1 setup to run TinyUSB host with pio-usb\r\n"); + + // Check for CPU frequency, must be multiple of 120Mhz for bit-banging USB + uint32_t cpu_hz = clock_get_hz(clk_sys); + if ( cpu_hz != 120000000UL && cpu_hz != 240000000UL ) { + delay(2000); // wait for native usb + Serial.printf("Error: CPU Clock = %lu, PIO USB require CPU clock must be multiple of 120 Mhz\r\n", cpu_hz); + Serial.printf("Change your CPU Clock to either 120 or 240 Mhz in Menu->CPU Speed \r\n"); + while(1) delay(1); + } + + pio_usb_configuration_t pio_cfg = PIO_USB_DEFAULT_CONFIG; + pio_cfg.pin_dp = HOST_PIN_DP; + + + USBHost.configure_pio_usb(1, &pio_cfg); + // run host stack on controller (rhport) 1 + // Note: For rp2040 pico-pio-usb, calling USBHost.begin() on core1 will have most of the + // host bit-banging processing work done in core1 to free up core0 for other work + usbhMIDI.begin(&USBHost, 1, onMIDIconnect, onMIDIdisconnect); + core1_booting = false; + while(core0_booting) ; +} + +// core1's loop +void loop1() +{ + USBHost.task(); +} + +void setup() +{ + TinyUSBDevice.setManufacturerDescriptor("LarsCo"); + TinyUSBDevice.setProductDescriptor("MIDI Masseuse"); + Serial.begin(115200); + if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { + Serial.println(F("SSD1306 allocation failed")); + for(;;); // Don't proceed, loop forever + } + + // Show initial display buffer contents on the screen -- + // the library initializes this with an Adafruit splash screen. + display.display(); + delay(2000); // Pause for 2 seconds + // Clear the buffer + display.clearDisplay(); + display.display(); + + display.setTextSize(1); + display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); + display.setCursor(0,0); + display.print("USB MIDI Messenger"); + display.setCursor(0,12); + display.print("Ch x > 1 Note_ CC#_\r\n"); + display.setCursor(0,24); + display.printf("Progs %u-%u \r\n", userProgOffset, (userProgOffset + 7)); + display.display(); + + pinMode(buttonAPin, INPUT_PULLUP); + pinMode(buttonBPin, INPUT); // OLED button B as a 100k pullup on it on 128x32 FW + pinMode(buttonCPin, INPUT_PULLUP); + + + MIDIusb.begin(); + MIDIusb.turnThruOff(); // turn off echo + + MIDIuart.begin(MIDI_CHANNEL_OMNI); // don't forget OMNI + +// while(!Serial); // wait for serial port + pinMode(LED_BUILTIN, OUTPUT); + Serial.println("USB Host to MIDI Messenger\r\n"); + core0_booting = false; + while(core1_booting) ; +} + +void loop() { + // Handle any incoming data; triggers MIDI IN callbacks + usbhMIDI.readAll(); + // Do other processing that might generate pending MIDI OUT data + + // Tell the USB Host to send as much pending MIDI OUT data as possible + usbhMIDI.writeFlushAll(); + + // Do other non-USB host processing + blinkLED(); + + int readingA = digitalRead(buttonAPin); + int readingB = digitalRead(buttonBPin); + int readingC = digitalRead(buttonCPin); + + if (readingA != lastButtonAState) { + lastDebounceATime = millis(); + } + if (readingB != lastButtonBState) { + lastDebounceBTime = millis(); + } + if (readingC != lastButtonCState) { + lastDebounceCTime = millis(); + } + + if ((millis() - lastDebounceATime) > debounceDelay) { + if (readingA != buttonAState) { + buttonAState = readingA; + if (buttonAState == LOW) { + userChannel = (userChannel % 16) + 1 ; // increment from 1-16 + Serial.printf("Ch%u\r\n", userChannel); + display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); + display.setCursor(0,12); + display.printf("Ch out %u \r\n", userChannel); + display.display(); + + } + } + } + + + if ((millis() - lastDebounceBTime) > debounceDelay) { + if (readingB != buttonBState) { + buttonBState = readingB; + if (buttonBState == LOW) { + userProgOffset = (userProgOffset + 8) % 128 ; + Serial.printf("Prog Progs %u through %u\r\n", userProgOffset, (userProgOffset + 7)); + display.setTextColor(SSD1306_WHITE, SSD1306_BLACK); + display.setCursor(0,24); + display.printf("Progs %u-%u \r\n", userProgOffset, (userProgOffset + 7)); + display.display(); + } + } + } + + + if ((millis() - lastDebounceCTime) > debounceDelay) { + if (readingC != buttonCState) { + buttonCState = readingC; + if (buttonCState == LOW) { + midiPanic(); + } + } + } + + lastButtonAState = readingA; + lastButtonBState = readingB; + lastButtonCState = readingC; + + +} diff --git a/Wearable_Time_Lapse_Camera/timelapse.py b/Wearable_Time_Lapse_Camera/timelapse.py new file mode 100644 index 000000000..46636b632 --- /dev/null +++ b/Wearable_Time_Lapse_Camera/timelapse.py @@ -0,0 +1,73 @@ +# SPDX-FileCopyrightText: 2024 Melissa leBlanc-Williams for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +#!/usr/bin/env python3 + +import os +import re +import time +import board +import digitalio + +# Timelapse script, because timelapse options in raspistill don't power +# down the camera between captures. Script also provides a camera busy LED +# (v2 cameras don't include one) and a system halt button. +# Limitations: if DEST is FAT32 filesystem, max of 65535 files in directory; +# if DEST is ext4 filesystem, may have performance issues above 10K files. +# For intervals <2 sec, better just to use raspistill's timelapse feature. + +# Configurable stuff... +INTERVAL = 15 # Time between captures, in seconds +WIDTH = 1280 # Image width in pixels +HEIGHT = 720 # Image height in pixels +QUALITY = 51 # JPEG image quality (0-100) +DEST = "/boot/timelapse" # Destination directory (MUST NOT CONTAIN NUMBERS) +PREFIX = "img" # Image prefix (MUST NOT CONTAIN NUMBERS) +HALT_PIN = board.D21 # Halt button GPIO pin (other end to GND) +LED_PIN = board.D5 # Status LED pin (v2 Pi cam lacks built-in LED) +COMMAND = "libcamera-still -n --width {width} --height {height} -q {quality} --thumb none -t 250 -o {outfile}" # pylint: disable=line-too-long +# COMMAND = "raspistill -n -w {width -h {height} -q {quality} -th none -t 250 -o {outfile}" + +def main(): + prevtime = 0 # Time of last capture (0 = do 1st image immediately) + halt = digitalio.DigitalInOut(HALT_PIN) + halt.switch_to_input(pull=digitalio.Pull.UP) + led = digitalio.DigitalInOut(LED_PIN) + led.switch_to_output() + + # Create destination directory (if not present) + os.makedirs(DEST, exist_ok=True) + + # Find index of last image (if any) in directory, start at this + 1 + files = os.listdir(DEST) + numbers = [ + int(re.search(r"\d+", f).group()) + for f in files + if f.startswith(PREFIX) and re.search(r"\d+", f) + ] + numbers.sort() + frame = numbers[-1] + 1 if numbers else 1 + currenttime = time.monotonic() + + while True: + while time.monotonic() < prevtime + INTERVAL: # Until next image capture time + currenttime = time.monotonic() + # Check for halt button -- hold >= 2 sec + while not halt.value: + if time.monotonic() >= currenttime + 2: + led.value = True + os.system("shutdown -h now") + outfile = f"{DEST}/{PREFIX}{frame:05}.jpg" + # echo $OUTFILE + led.value = True + os.system( + COMMAND.format(width=WIDTH, height=HEIGHT, quality=QUALITY, outfile=outfile) + ) + led.value = False + frame += 1 # Increment image counter + prevtime = currenttime # Save image cap time + + +if __name__ == "__main__": + main() diff --git a/Wearable_Time_Lapse_Camera/timelapse.sh b/Wearable_Time_Lapse_Camera/timelapse.sh new file mode 100644 index 000000000..b35bfc9b9 --- /dev/null +++ b/Wearable_Time_Lapse_Camera/timelapse.sh @@ -0,0 +1,62 @@ +#!/bin/sh + +#-------------------------------------------------------------------- +# NOTE !!!!! +# Do NOT use this script. +# +# This is the original script used for the guide. It is out of date +# and no longer used. It is only here for reference. Use the .py +# version of the script found in this same repository. +#-------------------------------------------------------------------- + +# Timelapse script, because timelapse options in raspistill don't power +# down the camera between captures. Script also provides a camera busy LED +# (v2 cameras don't include one) and a system halt button. +# 'gpio' command requires WiringPi: sudo apt-get install wiringpi +# Limitations: if DEST is FAT32 filesystem, max of 65535 files in directory; +# if DEST is ext4 filesystem, may have performance issues above 10K files. +# For intervals <2 sec, better just to use raspistill's timelapse feature. + +# Configurable stuff... +INTERVAL=15 # Time between captures, in seconds +WIDTH=1280 # Image width in pixels +HEIGHT=720 # Image height in pixels +QUALITY=51 # JPEG image quality (0-100) +DEST=/boot/timelapse # Destination directory (MUST NOT CONTAIN NUMBERS) +PREFIX=img # Image prefix (MUST NOT CONTAIN NUMBERS) +HALT=21 # Halt button GPIO pin (other end to GND) +LED=5 # Status LED pin (v2 Pi cam lacks built-in LED) +prevtime=0 # Time of last capture (0 = do 1st image immediately) + +gpio -g mode $HALT up # Initialize GPIO states +gpio -g mode $LED out +mkdir -p $DEST # Create destination directory (if not present) + +# Find index of last image (if any) in directory, start at this + 1 +FRAME=$(($(find $DEST -name "*.jpg" -printf %f\\n | sed 's/^[^1-9]*//g' | sort -rn | head -1 | sed 's/[^0-9]//g') + 1)) + +while : # Forever +do + while : # Until next image capture time + do + currenttime=$(date +%s) + if [ $(($currenttime-$prevtime)) -ge $INTERVAL ]; then + break # Time for next image cap + fi + # Check for halt button -- hold >= 2 sec + while [ $(gpio -g read $HALT) -eq 0 ]; do + if [ $(($(date +%s)-currenttime)) -ge 2 ]; then + gpio -g write $LED 1 + shutdown -h now + fi + done + done + + OUTFILE=`printf "$DEST/$PREFIX%05d.jpg" $FRAME` + # echo $OUTFILE + gpio -g write $LED 1 + raspistill -n -w $WIDTH -h $HEIGHT -q $QUALITY -th none -t 250 -o $OUTFILE + gpio -g write $LED 0 + FRAME=$(($FRAME + 1)) # Increment image counter + prevtime=$currenttime # Save image cap time +done \ No newline at end of file diff --git a/White_Noise_Rocket/code.py b/White_Noise_Rocket/code.py index 41dc0054a..f69e49b67 100644 --- a/White_Noise_Rocket/code.py +++ b/White_Noise_Rocket/code.py @@ -41,7 +41,7 @@ mixer.voice[0].level = 0 # propmaker neopixel pin pixel_pin = board.D5 -num_pixels = 35 +num_pixels = 40 pixels = neopixel.NeoPixel(pixel_pin, num_pixels, brightness=0.3, auto_write=False) diff --git a/Zelda_Tri_Rod_Prop/code.py b/Zelda_Tri_Rod_Prop/code.py new file mode 100644 index 000000000..92f4568d8 --- /dev/null +++ b/Zelda_Tri_Rod_Prop/code.py @@ -0,0 +1,133 @@ +# SPDX-FileCopyrightText: 2023 Liz Clark for Adafruit Industries +# +# SPDX-License-Identifier: MIT + +import time +import random +import board +import audiocore +import audiobusio +import audiomixer +from digitalio import DigitalInOut, Direction +from adafruit_ticks import ticks_ms, ticks_add, ticks_diff +import neopixel +import adafruit_lis3dh + +# CUSTOMIZE SENSITIVITY HERE: smaller numbers = more sensitive to motion +SWING_1_THRESHOLD = 130 +SWING_2_THRESHOLD = 170 + +pixel_time = 10 +Y_THRESHOLD = -9.0 +VERTICAL_TIME = 1.0 # Time in seconds the sensor needs to be vertical to trigger + +fx_1 = audiocore.WaveFile(open("/sounds/swing1.wav", "rb")) +fx_2 = audiocore.WaveFile(open("/sounds/swing1b.wav", "rb")) +fx_3 = audiocore.WaveFile(open("/sounds/swing2.wav", "rb")) +fx_4 = audiocore.WaveFile(open("/sounds/swing3.wav", "rb")) + +tracks = [fx_1, fx_2, fx_3, fx_4] +audio = audiobusio.I2SOut(board.I2S_BIT_CLOCK, board.I2S_WORD_SELECT, board.I2S_DATA) +mixer = audiomixer.Mixer(voice_count=3, sample_rate=22050, channel_count=1, + bits_per_sample=16, samples_signed=True) +audio.play(mixer) + +# external neopixels +num_pixels = 60 +pixels = neopixel.NeoPixel(board.EXTERNAL_NEOPIXELS, num_pixels, auto_write=False) +pixels.brightness = 0.2 + +# Gradient colors (start and end) +pale_green = (50, 255, 50) +yellow = (255, 255, 0) +# Pulse parameters +pulse_speed = 0.01 # Speed of the pulse (lower is slower) +brightness_step = 5 # Amount by which to step the brightness + +# onboard LIS3DH +i2c = board.I2C() +int1 = DigitalInOut(board.ACCELEROMETER_INTERRUPT) +lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, int1=int1) +# Accelerometer Range (can be 2_G, 4_G, 8_G, 16_G) +lis3dh.range = adafruit_lis3dh.RANGE_2_G + +# enable external power pin +# provides power to the external components +external_power = DigitalInOut(board.EXTERNAL_POWER) +external_power.direction = Direction.OUTPUT +external_power.value = True + +mode = 0 +brightness = 0 +increasing = True +pixel_clock = ticks_ms() +# Variables to track time +vertical_start_time = None + +while True: + # default + if mode == 0: + if ticks_diff(ticks_ms(), pixel_clock) >= pixel_time: + for i in range(num_pixels): + # Calculate gradient between pale_green and yellow + ratio = i / (num_pixels - 1) + r = int((yellow[0] - pale_green[0]) * ratio + pale_green[0]) + g = int((yellow[1] - pale_green[1]) * ratio + pale_green[1]) + b = int((yellow[2] - pale_green[2]) * ratio + pale_green[2]) + + # Adjust brightness by scaling the RGB values + scaled_r = int(r * (brightness / 255)) + scaled_g = int(g * (brightness / 255)) + scaled_b = int(b * (brightness / 255)) + + pixels[i] = scaled_r, scaled_g, scaled_b + pixels.show() + # Adjust brightness up and down + if increasing: + brightness += brightness_step + if brightness >= 255: + brightness = 255 + increasing = False + else: + brightness -= brightness_step + if brightness <= 0: + brightness = 0 + increasing = True + pixel_clock = ticks_add(pixel_clock, pixel_time) + x, y, z = lis3dh.acceleration + #print(x, y, z) + if abs(y) > Y_THRESHOLD and abs(x) < 2.0 and abs(z) < 2.0: + if vertical_start_time is None: + vertical_start_time = time.monotonic() # Start timing + elif time.monotonic() - vertical_start_time >= VERTICAL_TIME: + print("vertical") + mode = "vertical" + else: + vertical_start_time = None # Reset if the sensor is not vertical + accel_total = x * x + z * z + if accel_total >= SWING_2_THRESHOLD: + print("swing 2") + mode = "swing 2" + elif accel_total >= SWING_1_THRESHOLD: + print("swing 1") + mode = "swing 1" + elif mode == "swing 1": + mixer.voice[0].play(tracks[random.randint(0, 1)]) + while mixer.voice[0].playing: + pixels.fill(pale_green) + pixels.show() + mode = 0 + # clash or move + elif mode == "swing 2": + mixer.voice[1].play(tracks[2]) + while mixer.voice[1].playing: + pixels.fill(yellow) + pixels.show() + mode = 0 + elif mode == "vertical": + mixer.voice[2].play(tracks[3]) + while mixer.voice[2].playing: + pixels.fill(yellow) + pixels.show() + vertical_start_time = None + mode = 0 diff --git a/Zelda_Tri_Rod_Prop/sounds/swing1.wav b/Zelda_Tri_Rod_Prop/sounds/swing1.wav new file mode 100644 index 000000000..24ee16f20 Binary files /dev/null and b/Zelda_Tri_Rod_Prop/sounds/swing1.wav differ diff --git a/Zelda_Tri_Rod_Prop/sounds/swing1b.wav b/Zelda_Tri_Rod_Prop/sounds/swing1b.wav new file mode 100644 index 000000000..8f03710c8 Binary files /dev/null and b/Zelda_Tri_Rod_Prop/sounds/swing1b.wav differ diff --git a/Zelda_Tri_Rod_Prop/sounds/swing2.wav b/Zelda_Tri_Rod_Prop/sounds/swing2.wav new file mode 100644 index 000000000..06473d82a Binary files /dev/null and b/Zelda_Tri_Rod_Prop/sounds/swing2.wav differ diff --git a/Zelda_Tri_Rod_Prop/sounds/swing3.wav b/Zelda_Tri_Rod_Prop/sounds/swing3.wav new file mode 100644 index 000000000..ba4f74f28 Binary files /dev/null and b/Zelda_Tri_Rod_Prop/sounds/swing3.wav differ diff --git a/adalogger/.none.test.only b/adalogger/.none.test.only new file mode 100644 index 000000000..e69de29bb diff --git a/adalogger/adalogger-logging.ino b/adalogger/adalogger-logging.ino new file mode 100644 index 000000000..f919ee260 --- /dev/null +++ b/adalogger/adalogger-logging.ino @@ -0,0 +1,128 @@ +// SPDX-FileCopyrightText: 2019 Limor Fried/ladyada for Adafruit Industries +// +// SPDX-License-Identifier: MIT + +// Adalogger FeatherWing data logger, log data on pin A0 + +#include +#include + +// Set the pins used, varies depending on the Feather +#if defined(ESP8266) + #define LED_RED 0 + #define SD_CS 15 +#elif defined(ARDUINO_ADAFRUIT_FEATHER_ESP32C6) + #define LED_RED LED_BUILTIN + #define SD_CS 8 +#elif defined(ESP32) + #define LED_RED 13 + #define SD_CS 33 +#elif defined(ARDUINO_STM32F2_FEATHER) + #define LED_RED PB4 + #define SD_CS PB5 +#elif defined(TEENSYDUINO) + #define LED_RED 13 + #define SD_CS 10 +#elif defined(ARDUINO_FEATHER52832) + #define LED_RED 17 + #define SD_CS 11 +#else // 32u4, M0 or 328 + #define LED_RED LED_BUILTIN + #define SD_CS 4 +#endif + +File logfile; + +// blink out an error code +void error(uint8_t errnum) { + while(1) { + uint8_t i; + for (i=0; i") + + +class NopTrigger(TriggerBase): + """Does nothing.""" + + stems = None + + def on_activate(self): + return + +class BasicTrigger(TriggerBase): + """Plays a file each time the button is pressed down""" + + stems = [""] + +class HoldLoopingTrigger(TriggerBase): + """Plays a file as long as a button is held down + + This differs from the basic trigger because the loop stops as soon as the button + is released """ + + stems = ["HOLDL"] + + def on_activate(self): + self.play(loop=True) + while audiodev.playing: + poll_keys() + for trigger in triggers: + if trigger is self: + break + if trigger.wants_to_play: + self.wants_to_play = False + if not self.wants_to_play: + audiodev.stop() + +class LatchingLoopTrigger(HoldLoopingTrigger): + """Plays a file until the button is pressed again + + When the button is pressed again, stops the loop immediately.""" + + stems = ["LATCH"] + + def on_press(self): + if self.wants_to_play or not audiodev.playing: + self.wants_to_play = not self.wants_to_play + + def on_release(self): + pass # override default behavior + + +class PlayNextTrigger(TriggerBase): + stems = [f"NEXT{i}" for i in range(10)] + _phase = 0 + + +class PlayRandomTrigger(TriggerBase): + stems = [f"RAND{i}" for i in range(10)] + + generate_filenames = random_cycle + + + +trigger_classes = [ + BasicTrigger, + HoldLoopingTrigger, + LatchingLoopTrigger, + PlayNextTrigger, + PlayRandomTrigger, +] + + +def make_trigger(i): + prefix = f"T{i:02d}" + + for cls in trigger_classes: + if not cls.matches(prefix): + continue + return cls(prefix) + + return NopTrigger(prefix) + + +keys = keypad.Keys(pads, value_when_pressed=False) + +triggers = [make_trigger(i) for i in range(len(pads))] + +def poll_keys(): + while e := keys.events.get(): + trigger = triggers[e.key_number] + if e.pressed: + trigger.on_press() + else: + trigger.on_release() + print(e.pressed, trigger) + +print(triggers) + +reversed_triggers = list(reversed(triggers)) + +while True: + poll_keys() + for t in triggers: + if t.wants_to_play: + print(t) + t.on_activate() + break diff --git a/circuitpython-audio-fx/polyphonic/T00.mp3 b/circuitpython-audio-fx/polyphonic/T00.mp3 new file mode 100644 index 000000000..c1251c01a Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T00.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T01RAND0.mp3 b/circuitpython-audio-fx/polyphonic/T01RAND0.mp3 new file mode 100644 index 000000000..32a7548c1 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T01RAND0.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T01RAND1.mp3 b/circuitpython-audio-fx/polyphonic/T01RAND1.mp3 new file mode 100644 index 000000000..39aff6f00 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T01RAND1.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T01RAND2.mp3 b/circuitpython-audio-fx/polyphonic/T01RAND2.mp3 new file mode 100644 index 000000000..bfd682216 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T01RAND2.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T01RAND3.mp3 b/circuitpython-audio-fx/polyphonic/T01RAND3.mp3 new file mode 100644 index 000000000..153c76291 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T01RAND3.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T01RAND4.mp3 b/circuitpython-audio-fx/polyphonic/T01RAND4.mp3 new file mode 100644 index 000000000..63032f479 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T01RAND4.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T02.mp3 b/circuitpython-audio-fx/polyphonic/T02.mp3 new file mode 100644 index 000000000..5d0730c4c Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T02.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T03.mp3 b/circuitpython-audio-fx/polyphonic/T03.mp3 new file mode 100644 index 000000000..501ebb912 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T03.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T04HOLDL.mp3 b/circuitpython-audio-fx/polyphonic/T04HOLDL.mp3 new file mode 100644 index 000000000..b65ff78e6 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T04HOLDL.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T05NEXT0.mp3 b/circuitpython-audio-fx/polyphonic/T05NEXT0.mp3 new file mode 100644 index 000000000..da73c7173 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T05NEXT0.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T05NEXT1.mp3 b/circuitpython-audio-fx/polyphonic/T05NEXT1.mp3 new file mode 100644 index 000000000..d81ecc95f Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T05NEXT1.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T05NEXT2.mp3 b/circuitpython-audio-fx/polyphonic/T05NEXT2.mp3 new file mode 100644 index 000000000..245cc9e42 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T05NEXT2.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T06LATCH.mp3 b/circuitpython-audio-fx/polyphonic/T06LATCH.mp3 new file mode 100644 index 000000000..8cb950da4 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T06LATCH.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T07.mp3 b/circuitpython-audio-fx/polyphonic/T07.mp3 new file mode 100644 index 000000000..d32870566 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T07.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T08.mp3 b/circuitpython-audio-fx/polyphonic/T08.mp3 new file mode 100644 index 000000000..bd85b2cc3 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T08.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T09.mp3 b/circuitpython-audio-fx/polyphonic/T09.mp3 new file mode 100644 index 000000000..e64b560b3 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T09.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T10.mp3 b/circuitpython-audio-fx/polyphonic/T10.mp3 new file mode 100644 index 000000000..db411a8a7 Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T10.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/T11HOLDL.mp3 b/circuitpython-audio-fx/polyphonic/T11HOLDL.mp3 new file mode 100644 index 000000000..c1251c01a Binary files /dev/null and b/circuitpython-audio-fx/polyphonic/T11HOLDL.mp3 differ diff --git a/circuitpython-audio-fx/polyphonic/code.py b/circuitpython-audio-fx/polyphonic/code.py new file mode 100644 index 000000000..6426289bb --- /dev/null +++ b/circuitpython-audio-fx/polyphonic/code.py @@ -0,0 +1,332 @@ +# SPDX-FileCopyrightText: Copyright 2024 Jeff Epler for Adafruit Industries +# SPDX-License-Identifier: MIT + +import os +import collections +import io +import random + +import board +import keypad +import audiobusio +import audiocore +import audiomp3 +import audiomixer + +# Configure the pins to use -- earlier in list = higher priority +pads = [ + board.GP0, board.GP1, board.GP2, board.GP3, + board.GP4, board.GP5, board.GP6, board.GP7, + board.GP8, board.GP9, board.GP10, board.GP11, + board.GP12, board.GP13, board.GP14, board.GP15 +] + +# Configure max voices to play at once +# (No matter what, at most 4 MP3 decoders) +# If set this number too high, playback will stutter. use lower bit rates or fewer voices +# +# when the number of active samples being played back exceeds the number of voices, +# the top numbered playing sample is stopped. There is no logic to restore a sample that +# got stopped in this way. +# +# (this may not be the same as the old FX board logic) +max_simultaneous_voices = 2 +audiodev = audiobusio.I2SOut( + bit_clock=board.GP16, word_select=board.GP17, data=board.GP18 +) + +# This is enough to register as an MP3 file with mp3decoder!, allows creating a decoder +# without "opening" a "file"! +EMPTY_MP3_BYTES = b"\xff\xe3" + +def exists(p): + try: + os.stat(p) + return True + except OSError: + return False + + +def random_choice(seq): + return seq[random.randrange(len(seq))] + + +# There's no notification when something finishes playing. So, first loop over +# all triggers; if they're not playing, then calling force_off() doesn't actually +# stop any audio (it's already stopped) but it DOES mark the voice & decoder as +# available. Otherwise, we might needlessly stop some other sample. +def free_stopped_channels(): + for i in triggers: + if i.voice and not i.playing: + print("fst") + i.force_off() + + +# iterating on reversed triggers gives priority to **lower** numbered triggers +def ensure_available_decoder(): + if available_decoders: + return available_decoders.popleft() + + for i in reversed_triggers: + i.force_off() + if available_decoders: + break + + return available_decoders.popleft() + + +def ensure_available_voice(): + if available_voices: + return available_voices.popleft() + + for i in reversed_triggers: + i.force_off() + if available_voices: + break + + return available_voices.popleft() + + +class TriggerBase: + def __init__(self, prefix): + self._decoder = None + self.voice = None + self.filenames = list(self._gather_filenames(prefix)) + + def _gather_filenames(self, prefix): + for stem in self.stems: + name_mp3 = f"{prefix}{stem}.mp3" + if exists(name_mp3): + yield name_mp3 + continue + name_wav = f"{prefix}{stem}.wav" + if exists(name_wav): + yield name_wav + continue + + def get_sample(self, path): + if path.endswith(".mp3"): + self._decoder = ensure_available_decoder() + self._decoder.open(path) + return self._decoder + else: + return audiocore.WaveFile(path) + + def play(self, path, loop=False): + self.force_off() + free_stopped_channels() + sample = self.get_sample(path) + self.voice = ensure_available_voice() + self.voice.play(sample, loop=loop) + + def force_off(self): + print("force off", self) + voice = self.voice + if voice is not None: + print(f"return voice {id(voice)}") + self.voice = None + voice.stop() + available_voices.append(voice) + decoder = self._decoder + if decoder is not None: + print(f"return decoder {id(decoder)}") + self._decoder = None + print(list(available_decoders), end=" ") + available_decoders.append(decoder) + print("->", list(available_decoders)) + + @property + def playing(self): + return False if self.voice is None else self.voice.playing + + @classmethod + def matches(cls, prefix): + stem = cls.stems[0] + name_mp3 = f"{prefix}{stem}.mp3" + name_wav = f"{prefix}{stem}.wav" + return exists(name_wav) or exists(name_mp3) + + def __repr__(self): + return f"<{self.__class__.__name__} {self.filenames}{' playing' if self.playing else ''}>" + + +class NopTrigger(TriggerBase): + """Does nothing.""" + + stems = [""] + + def on_press(self): + pass + + def on_release(self): + pass + + +class BasicTrigger(TriggerBase): + """Plays a file each time the button is pressed down""" + + stems = [""] + + def on_press(self): + self.play(self.filenames[0]) + + def on_release(self): + pass + + +class HoldLoopingTrigger(TriggerBase): + """Plays a file as long as a button is held down""" + + stems = ["HOLDL"] + + def on_press(self): + self.play(self.filenames[0], loop=True) + + def on_release(self): + self.force_off() + + +class LatchingLoopTrigger(TriggerBase): + """Toggles playing each time the button is pressed""" + + stems = ["LATCH"] + + def on_press(self): + if self.playing: + self.force_off() + else: + self.play(self.filenames[0], loop=True) + + def on_release(self): + pass + + +class PlayNextTrigger(TriggerBase): + stems = [f"NEXT{i}" for i in range(10)] + + def __init__(self, prefix): + super().__init__(prefix) + self._phase = 0 + + def on_press(self): + self.play(self.filenames[self._phase]) + self._phase = (self._phase + 1) % len(self.filenames) + + def on_release(self): + pass + + +class PlayRandomTrigger(TriggerBase): + stems = [f"RAND{i}" for i in range(10)] + + def on_press(self): + self.play(random_choice(self.filenames)) + + def on_release(self): + pass + + +trigger_classes = [ + BasicTrigger, + HoldLoopingTrigger, + LatchingLoopTrigger, + PlayNextTrigger, + PlayRandomTrigger, +] + + +def make_trigger(i): + prefix = f"T{i:02d}" + + for cls in trigger_classes: + if not cls.matches(prefix): + continue + return cls(prefix) + + return NopTrigger(prefix) + + +# No matter what, at most 4 MP3 decoders +decoders = [ + audiomp3.MP3Decoder(io.BytesIO(EMPTY_MP3_BYTES)) + for _ in range(min(4, max_simultaneous_voices)) +] +print(decoders) +available_decoders = collections.deque(decoders, len(decoders)) +print(list(available_decoders)) + +keys = keypad.Keys(pads, value_when_pressed=False) + +triggers = [make_trigger(i) for i in range(len(pads))] + + +def playback_specs(sample): + return dict( + channel_count=sample.channel_count, + sample_rate=sample.sample_rate, + bits_per_sample=sample.bits_per_sample, + ) + + +def check_match_make_mixer(dev): + all_filenames = [] + for i in triggers: + all_filenames.extend(i.filenames) + + if not all_filenames: + raise RuntimeError("*** NO AUDIO FILES FOUND ***") + + if max_simultaneous_voices == 1: + return [dev] + + first_trigger = triggers[0] + + mixer_buffer_size = (1152 * 4) * 4 + + specs = None + for filename in all_filenames: + sample = first_trigger.get_sample(filename) + new_specs = playback_specs(sample) + if specs is None: + specs = new_specs + else: + if specs != new_specs: + print("*** Audio file specs don't match ***") + print("{all_filenames[0]}: {specs}") + print("{filename}: {specs}") + raise RuntimeError("*** WITH POLYPHONY, ALL MUST MATCH ***") + first_trigger.force_off() + + print(f"audio specs: {specs}") + samples_signed = specs["bits_per_sample"] == 16 + mixer = audiomixer.Mixer( + voice_count=max_simultaneous_voices, + buffer_size=mixer_buffer_size, + samples_signed=samples_signed, + **specs, + ) + dev.play(mixer) + + return list(mixer.voice) + + +print(triggers) +print(list(available_decoders)) + +reversed_triggers = list(reversed(triggers)) + +voices = check_match_make_mixer(audiodev) +print(list(available_decoders)) +available_voices = collections.deque(voices, len(voices)) + +while True: + if e := keys.events.get(): + print("event", e) + print("available decoders", *(id(i) for i in available_decoders)) + print("available voices", *(id(i) for i in available_voices)) + trigger = triggers[e.key_number] + if e.pressed: + trigger.on_press() + else: + trigger.on_release() + print(triggers) diff --git a/library.deps b/library.deps index 562811304..c25f99062 100644 --- a/library.deps +++ b/library.deps @@ -1 +1 @@ -depends=Adafruit ILI9341, Adafruit BusIO, SD, Adafruit NeoPixel, Adafruit VS1053 Library, Adafruit BluefruitLE nRF51, Adafruit seesaw Library, Ethernet, Adafruit IO Arduino, FastLED, Adafruit LiquidCrystal, Adafruit SoftServo, TinyWireM, Adafruit AM radio library, WaveHC, Adafruit LED Backpack Library, MAX31850 OneWire, Adafruit VC0706 Serial Camera Library, RTClib, Adafruit SleepyDog Library, Adafruit Thermal Printer Library, Adafruit Zero I2S Library, Adafruit EPD, Adafruit SSD1351 library, Adafruit FONA Library, Adafruit Motor Shield V2 Library, Adafruit NeoMatrix, Adafruit Soundboard library, Adafruit Circuit Playground, ArduinoJson, Adafruit TCS34725, Adafruit Pixie, Adafruit GPS Library, TinyGPS, WiFi101, Adafruit DotStar, Adafruit Si7021 Library, Adafruit WS2801 Library, Mouse, Keyboard, Time, IRremote, Adafruit LSM9DS0 Library, Adafruit Arcada Library, MIDIUSB, PubSubClient, Adafruit LIS2MDL, Adafruit NeoPXL8, Adafruit MCP23017 Arduino Library, Adafruit MLX90640, LiquidCrystal, Adafruit NeoTrellis M4 Library, RGB matrix Panel, Adafruit MLX90614 Library, Adafruit RGB LCD Shield Library, MAX6675 library, Adafruit MP3, Adafruit Keypad, Adafruit Arcada GifDecoder, Keypad, Neosegment, Encoder, Adafruit TiCoServo, Adafruit Trellis Library, FauxmoESP, Adafruit LSM303 Accel, Adafruit LSM303DLH Mag, Adafruit LSM303DLHC, CapacitiveSensor, Adafruit Zero PDM Library, Adafruit DMA neopixel library, elapsedMillis, DST RTC, Adafruit SHARP Memory Display, Adafruit SPIFlash, BSEC Software Library, WiiChuck, Adafruit DPS310, Adafruit AHTX0, RotaryEncoder, Adafruit MCP9808 Library, LSM303, Adafruit Protomatter, Adafruit IS31FL3741 Library, Sensirion I2C SCD4x, Adafruit TestBed, Bounce2, Adafruit AHRS, Adafruit DRV2605 Library, STM32duino VL53L4CD, PicoDVI - Adafruit Fork, Adafruit MMA8451 Library, Adafruit TSC2007, GFX Library for Arduino, Adafruit PyCamera Library +depends=Adafruit ILI9341, Adafruit BusIO, SD, Adafruit NeoPixel, Adafruit VS1053 Library, Adafruit BluefruitLE nRF51, Adafruit seesaw Library, Ethernet, Adafruit IO Arduino, FastLED, Adafruit LiquidCrystal, Adafruit SoftServo, TinyWireM, Adafruit AM radio library, WaveHC, Adafruit LED Backpack Library, MAX31850 OneWire, Adafruit VC0706 Serial Camera Library, RTClib, Adafruit SleepyDog Library, Adafruit Thermal Printer Library, Adafruit Zero I2S Library, Adafruit EPD, Adafruit SSD1351 library, Adafruit FONA Library, Adafruit Motor Shield V2 Library, Adafruit NeoMatrix, Adafruit Soundboard library, Adafruit Circuit Playground, ArduinoJson, Adafruit TCS34725, Adafruit Pixie, Adafruit GPS Library, TinyGPS, WiFi101, Adafruit DotStar, Adafruit Si7021 Library, Adafruit WS2801 Library, Mouse, Keyboard, Time, IRremote, Adafruit LSM9DS0 Library, Adafruit Arcada Library, MIDIUSB, PubSubClient, Adafruit LIS2MDL, Adafruit NeoPXL8, Adafruit MCP23017 Arduino Library, Adafruit MLX90640, LiquidCrystal, Adafruit NeoTrellis M4 Library, RGB matrix Panel, Adafruit MLX90614 Library, Adafruit RGB LCD Shield Library, MAX6675 library, Adafruit MP3, Adafruit Keypad, Adafruit Arcada GifDecoder, Keypad, Neosegment, Encoder, Adafruit TiCoServo, Adafruit Trellis Library, FauxmoESP, Adafruit LSM303 Accel, Adafruit LSM303DLH Mag, Adafruit LSM303DLHC, CapacitiveSensor, Adafruit Zero PDM Library, Adafruit DMA neopixel library, elapsedMillis, DST RTC, Adafruit SHARP Memory Display, Adafruit SPIFlash, BSEC Software Library, WiiChuck, Adafruit DPS310, Adafruit AHTX0, RotaryEncoder, Adafruit MCP9808 Library, LSM303, Adafruit Protomatter, Adafruit IS31FL3741 Library, Sensirion I2C SCD4x, Adafruit TestBed, Bounce2, Adafruit AHRS, Adafruit DRV2605 Library, STM32duino VL53L4CD, PicoDVI - Adafruit Fork, Adafruit MMA8451 Library, Adafruit TSC2007, GFX Library for Arduino, Adafruit PyCamera Library, Adafruit ADG72x, Adafruit BNO055, Adafruit SHT4x Library, Adafruit VCNL4200 Library, Adafruit GC9A01A diff --git a/simple_strand_palettes/simple_strand_palettes.ino b/simple_strand_palettes/simple_strand_palettes.ino index fbdf5f777..6054840ca 100644 --- a/simple_strand_palettes/simple_strand_palettes.ino +++ b/simple_strand_palettes/simple_strand_palettes.ino @@ -48,7 +48,7 @@ void setup() { // Forward declarations of an array of cpt-city gradient palettes, and // a count of how many there are. The actual color palette definitions // are at the bottom of this file. -extern const TProgmemRGBGradientPalettePtr gGradientPalettes[]; +extern const TProgmemRGBGradientPaletteRef gGradientPalettes[]; extern const uint8_t gGradientPaletteCount; // Current palette number from the 'playlist' of color palettes @@ -618,7 +618,7 @@ DEFINE_GRADIENT_PALETTE( bhw1_28_gp ) { // // This list of color palettes acts as a "playlist"; you can // add or delete, or re-arrange as you wish. -const TProgmemRGBGradientPalettePtr gGradientPalettes[] = { +const TProgmemRGBGradientPaletteRef gGradientPalettes[] = { bhw1_28_gp, Sunset_Real_gp, es_rivendell_15_gp, @@ -657,7 +657,7 @@ const TProgmemRGBGradientPalettePtr gGradientPalettes[] = { // Count of how many cpt-city gradients are defined: const uint8_t gGradientPaletteCount = - sizeof( gGradientPalettes) / sizeof( TProgmemRGBGradientPalettePtr ); + sizeof( gGradientPalettes) / sizeof( TProgmemRGBGradientPaletteRef ); @@ -677,4 +677,3 @@ const uint8_t gGradientPaletteCount = FastLED.show(); FastLED.delay(20); } -